Мне нужно сохранить всю директорию, содержащую файлы в определенном подкаталоге, но удалить остальные каталоги, в которых подкаталог пуст.
Чтобы быть более конкретным, вот изображение:
[ f1]Подкаталоги могут содержать или не содержать файл. Поэтому мне нужно удалить весь каталог, например «312311» & amp; «566532» и только «453453» должны быть оставлены со всеми данными в нем. Bcoz у него есть файл в папке «Запись», которая является для меня конкретной папкой.
Я видел много сообщений, но он ссылается на многие конкретные имена файлов. Любая помощь будет высоко оценена, поскольку мне нужно делать много раз в неделю.
Используя find и xargs:
find A -type d -name 'Recording' -empty -printf '%h\0' | xargs -0 echo rm -rf
(удалите echo, как только вам станет удобно, что он идентифицирует правильные каталоги). Часть printf '%h\0 печатает родительский каталог с нулевым завершением - из man find:
%h Leading directories of file's name (all but the last ele‐
ment). If the file name contains no slashes (since it is
in the current directory) the %h specifier expands to
".".
Пример: с учетом
$ tree A
A
├── 312311
│ ├── a.txt
│ ├── b.txt
│ └── Recording
├── 453453
│ ├── a.txt
│ ├── b.txt
│ └── Recording
│ └── a.mp3
└── 566532
├── a.txt
├── b.txt
└── Recording
6 directories, 7 files
, затем
$ find A -type d -name 'Recording' -empty -printf '%h\0' | xargs -0 rm -rf
$
$ tree A
A
└── 453453
├── a.txt
├── b.txt
└── Recording
└── a.mp3
2 directories, 3 files
Вот более простое решение bash:
for d in */; do rmdir "$d/Recording" && rm -r "$d"; done
Это работает, потому что rmdir завершится с ошибкой, если каталог не пуст, а && предотвратит выполнение rm -r, если только [ f5] преуспевает. Glob */ гарантирует, что вы работаете только с каталогами, поэтому другие файлы не будут затронуты.