l oop через указанные c подпапки внутри папки и удалить файлы, содержащие указанное c имя - AIX - PullRequest
0 голосов
/ 17 января 2020

Моя структура папок выглядит следующим образом: есть 100 папок, и у каждой папки есть 3 подпапки (представьте себе A, B и C). Моя задача - удалить файлы, в которых указан c текст внутри папки C, из всех 100 папок.

У меня минимальные знания по командам Unix, и моя задача - выполнять на сервере AIX я попытался погуглить и нашел скрипт ниже (он на самом деле не делает удаление). и когда я пытался выполнить следующий скрипт, я получаю следующую ошибку «test.sh [5]: принято: не найдено». но на самом деле существует «принятая» папка. Не знаю, почему произошла ошибка.

for dir in $(ls)
do 
    for dir2 in $(ls)
        do
        cd accepted
        echo $(ls)
        done    
done 

Может ли кто-нибудь помочь мне обновить скрипт для выполнения "l oop через подпапки внутри папки и удаления файлы содержат специфический c текст внутри специфической c только подпапки "?

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Позвольте мне взять в качестве примера дерево каталогов:

X
├── A
│   ├── D
│   │   ├── bar.txt
│   │   └── foo.txt
│   ├── E
│   │   ├── bar.txt
│   │   └── foo.txt
│   └── F
│       ├── bar.txt
│       └── foo.txt
├── B
│   ├── D
│   │   ├── bar.txt
│   │   └── foo.txt
│   ├── E
│   │   ├── bar.txt
│   │   └── foo.txt
│   └── F
│       ├── bar.txt
│       └── foo.txt
└── C
    ├── D
    │   ├── bar.txt
    │   └── foo.txt
    ├── E
    │   ├── bar.txt
    │   └── foo.txt
    └── F
        ├── bar.txt
        └── foo.txt

И предположим, что вы хотите удалить файлы, начинающиеся с foo только из каталога F.
Затем попробуйте следующее:

find X/*/F -type f -name "foo*" -delete

Теперь дерево каталогов будет выглядеть так:

X
├── A
│   ├── D
│   │   ├── bar.txt
│   │   └── foo.txt
│   ├── E
│   │   ├── bar.txt
│   │   └── foo.txt
│   └── F
│       └── bar.txt
├── B
│   ├── D
│   │   ├── bar.txt
│   │   └── foo.txt
│   ├── E
│   │   ├── bar.txt
│   │   └── foo.txt
│   └── F
│       └── bar.txt
└── C
    ├── D
    │   ├── bar.txt
    │   └── foo.txt
    ├── E
    │   ├── bar.txt
    │   └── foo.txt
    └── F
        └── bar.txt

Надеюсь, это соответствует вашему требованию.

0 голосов
/ 17 января 2020

Хотя возможно реализовать логику c для идентификации файлов с помощью поиска по дереву, в этом случае это не требуется. Обратите внимание на следующее.

Обратите внимание, что решение НЕ будет работать, если в именах файлов есть специальные символы (пробелы, кавычки, новые строки). Он будет работать для «обычных» имен файлов (с символами a-zA-Z0-9_-. et c) ..

file_list=$(grep -l SomeText */C/*)
rm $file_list

Возможно объединить в одну строку - используйте с осторожностью

rm $(grep -l SomeText */C/*)

Вы также можете использовать rm -i вместо rm, чтобы получить запрос на удаление каждого файла, если это необходимо.

...