Удалить родительский каталог (непустой), если определенный дочерний каталог пуст

Мне нужно сохранить всю директорию, содержащую файлы в определенном подкаталоге, но удалить остальные каталоги, в которых подкаталог пуст.

Чтобы быть более конкретным, вот изображение:

[ f1]

Подкаталоги могут содержать или не содержать файл. Поэтому мне нужно удалить весь каталог, например «312311» & amp; «566532» и только «453453» должны быть оставлены со всеми данными в нем. Bcoz у него есть файл в папке «Запись», которая является для меня конкретной папкой.

Я видел много сообщений, но он ссылается на многие конкретные имена файлов. Любая помощь будет высоко оценена, поскольку мне нужно делать много раз в неделю.

1
задан 19 March 2017 в 14:24

2 ответа

Используя 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
11
ответ дан 23 May 2018 в 00:31
  • 1
    find A-type d -name 'Recording' -empty -printf '% h \ 0' | xargs -0 echo rm -rf это просто печать " rm-rf " И найти A-тип d-имя 'Запись' -empty -printf '% h \ 0' | xargs -0 rm -rf не работает ... Я что-то делаю неправильно. – Derek James 18 March 2017 в 17:11
  • 2
    @DerekJames вам нужно заменить A на фактический каталог. – Jacob Vlijm 18 March 2017 в 17:11
  • 3
    Было бы нормально включить регулярное выражение вместо имени Recording , так как OP дал имена файлов с номерами, например [\d]*? – George Udosen 18 March 2017 в 17:20
  • 4
    @JacobVlijm: Я заменил фактический каталог, но все еще не работает? – Derek James 18 March 2017 в 17:23
  • 5
    @DerekJames, что странно! он работал на моей системе, но вы, возможно, забыли сначала записать cd в каталог? Waitwait, это не имеет значения ... – Jacob Vlijm 18 March 2017 в 17:26

Вот более простое решение bash:

for d in */; do rmdir "$d/Recording" && rm -r "$d"; done

Это работает, потому что rmdir завершится с ошибкой, если каталог не пуст, а && предотвратит выполнение rm -r, если только [ f5] преуспевает. Glob */ гарантирует, что вы работаете только с каталогами, поэтому другие файлы не будут затронуты.

3
ответ дан 23 May 2018 в 00:31

Другие вопросы по тегам:

Похожие вопросы: