2

Каким-то образом я получил копию каждой папки внутри себя.

Какую команду оболочки я могу запустить, чтобы удалить все папки, которые находятся внутри папок с одинаковым именем?

скриншот проблемы

Например, в приведенном выше примере, запустив команду от родителя lnp_eventbrite и libraries , удалите только папки lnp_eventbrite и libraries внутри себя.

2 ответа2

3

В tcsh вы можете сделать это:

foreach i (*)
   if ( -e "$i/$i" ) rm -rf "$i/$i"
end
1

Если вы хотите удалить соответствующие подкаталоги, вы должны быть уверены: 1) он пуст 2) это каталог с тем же именем, что и у его родителя. И вам нужно начинать с самого глубокого вниз (например: A/A/A/A/A/: начинать с дальнейшего вниз).

Вот способ сделать это в bash + grep + find (довольно простые, как я тестирую на старой машине):

recdeldir ()
{
    _tab_="`printf '\011'`";
    find . -type d -depth -print | grep -v '^\.$' | while IFS= read dir; do
        echo "======= $dir =============";
        pushd "${dir}";
        if [ -d "../../`basename ${dir}`" ]; then
            echo "Matching subdir: `pwd`";
            if ( find . -print | grep -v '^\.$' | wc -c | grep "[ ${_tab_}]*0$" >/dev/null ); then
                echo "empty, deleting `pwd`/";
                cd ..;
                rmdir "`basename ${dir}`";
            else
                echo "`pwd`/ is not empty. doing nothing.";
            fi;
        else
            echo "Not matching subdir : `pwd`";
        fi;
        popd;
    done
}

И вот пример использования этой функции: я создал /tmp/DIR , и внутри него я создал несколько тестовых примеров (с несколькими dir с одинаковыми именами, некоторые начинаются с ".", А в некоторых из них). я добавил другие файлы, чтобы гарантировать, что они не будут удалены и приняты во внимание и т. д.

Другими словами, я удостоверяюсь, что в этом сценарии НЕ удаляется subdir, соответствующий имени dir родителя, если этот subdir не пустой, гарантируя, что мы не удаляем вещи, которые мы не должны удалять (я считаю, что это соответствует пожеланиям автора), Если мы должны удалить независимо от содержимого / пустоты, следует внести изменения, чтобы не беспокоиться о разнице «пусто / не пусто».

В вашем сеансе bash просто скопируйте / вставьте эту функцию выше, чтобы создать ее в текущей оболочке (или добавить в файл, который вы создаете, или в ваш bashrc), а затем вы можете использовать его:

Затем я перешел в /tmp/DIR и запустил: recdeldir

bash-2.05b$ find . -ls
 8192    1 drwxrwxr-x  5 user      group          256 Dec 18 12:03 .
 8193    1 drwxrwxr-x  3 user      group          256 Dec 18 11:31 ./tre
 8194    0 -rw-rw-r--  1 user      group            0 Dec 18 11:31 ./tre/sdfsd
 8195    0 -rw-rw-r--  1 user      group            0 Dec 18 11:31 ./tre/sdfsdq
 8196    1 drwxrwxr-x  2 user      group          256 Dec 18 12:10 ./tre/tre
 8199    0 -rw-rw-r--  1 user      group            0 Dec 18 11:31 ./tre/tre/i
 8200    1 drwxrwxr-x  3 user      group          256 Dec 18 12:11 ./.O
 8203    1 drwxrwxr-x  3 user      group          256 Dec 18 12:11 ./.O/.O
 8204    1 drwxrwxr-x  2 user      group          256 Dec 18 12:11 ./.O/.O/.O
 8205    0 -rw-rw-r--  1 user      group            0 Dec 18 12:11 ./.O/.something
 8201    1 drwxrwxr-x  3 user      group          256 Dec 18 12:11 ./.OOO
 8198    1 drwxrwxr-x  3 user      group          256 Dec 18 12:11 ./.OOO/.OOO
 8202    1 drwxrwxr-x  2 user      group          256 Dec 18 12:11 ./.OOO/.OOO/.OOO
 8197    1 -rw-rw-r--  1 user      group          967 Dec 18 12:11 ./result
bash-2.05b$ recdeldir
======= ./tre/tre =============
/tmp/DIR/tre/tre /tmp/DIR
Matching subdir: /tmp/DIR/tre/tre
/tmp/DIR/tre/tre/ is not empty. doing nothing.
/tmp/DIR
======= ./tre =============
/tmp/DIR/tre /tmp/DIR
Not matching subdir : /tmp/DIR/tre
/tmp/DIR
======= ./.O/.O/.O =============
/tmp/DIR/.O/.O/.O /tmp/DIR
Matching subdir: /tmp/DIR/.O/.O/.O
empty, deleting /tmp/DIR/.O/.O/.O/
/tmp/DIR
======= ./.O/.O =============
/tmp/DIR/.O/.O /tmp/DIR
Matching subdir: /tmp/DIR/.O/.O
empty, deleting /tmp/DIR/.O/.O/
/tmp/DIR
======= ./.O =============
/tmp/DIR/.O /tmp/DIR
Not matching subdir : /tmp/DIR/.O
/tmp/DIR
======= ./.OOO/.OOO/.OOO =============
/tmp/DIR/.OOO/.OOO/.OOO /tmp/DIR
Matching subdir: /tmp/DIR/.OOO/.OOO/.OOO
empty, deleting /tmp/DIR/.OOO/.OOO/.OOO/
/tmp/DIR
======= ./.OOO/.OOO =============
/tmp/DIR/.OOO/.OOO /tmp/DIR
Matching subdir: /tmp/DIR/.OOO/.OOO
empty, deleting /tmp/DIR/.OOO/.OOO/
/tmp/DIR
======= ./.OOO =============
/tmp/DIR/.OOO /tmp/DIR
Not matching subdir : /tmp/DIR/.OOO
/tmp/DIR
bash-2.05b$ find . -ls
 8192    1 drwxrwxr-x  5 user      group          256 Dec 18 12:03 .
 8193    1 drwxrwxr-x  3 user      group          256 Dec 18 11:31 ./tre
 8194    0 -rw-rw-r--  1 user      group            0 Dec 18 11:31 ./tre/sdfsd
 8195    0 -rw-rw-r--  1 user      group            0 Dec 18 11:31 ./tre/sdfsdq
 8196    1 drwxrwxr-x  2 user      group          256 Dec 18 12:10 ./tre/tre
 8199    0 -rw-rw-r--  1 user      group            0 Dec 18 11:31 ./tre/tre/i
 8200    1 drwxrwxr-x  2 user      group          256 Dec 18 12:11 ./.O
 8205    0 -rw-rw-r--  1 user      group            0 Dec 18 12:11 ./.O/.something
 8201    1 drwxrwxr-x  2 user      group          256 Dec 18 12:11 ./.OOO
 8197    1 -rw-rw-r--  1 user      group          967 Dec 18 12:11 ./result
bash-2.05b$

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .