Найти файлы в некоторых каталогах с определенным шаблоном имен и удалить их?

#linux #bash

Вопрос:

В каталоге есть много подкаталогов. Например,

 /tmp/dir/00/
/tmp/dir/01/
....
/tmp/dir/99/
 

Как tar найти все подкаталоги, имя которых меньше 50 ?

 find /tmp/dir/ -name "???" -exec tar -rzf file1.tgz {} ;
tar -czf file1.tgz ???
 

Комментарии:

1. Есть ли какие-нибудь недостающие номера? Если нет, tar -czf file1.tgz /tmp/dir/{00..50}/ должно работать нормально.

2. Вы хотите использовать tar для каждого соответствующего каталога по отдельности или только один файл tar для всех каталогов?

3. @anubhava, один tar для всех выбранных файлов.

Ответ №1:

Привет 🙂

Вот как бы я это сделал, учитывая предоставленную вами информацию

Создайте список путей к вашему каталогу, все 51 из них

 echo > dirlist.txt ; 
for x in $(seq -w 00 50)
do
echo "/tmp/$x" >> dirlist.txt
done
 

Затем используйте команду tar с переключателем-T, чтобы загрузить список из файла:

 tar -czf myarchive.tar.gz -T dirlist.txt
 

Проверьте свой архив , проверьте первые 3 строки:

 tar -tvzf myarchive.tar.gz | head -3
drwxr-xr-x  0 neil   wheel       0 18 Jun 19:36 tmp/00/
drwxr-xr-x  0 neil   wheel       0 18 Jun 19:36 tmp/01/
drwxr-xr-x  0 neil   wheel       0 18 Jun 19:36 tmp/02/
 

Комментарии:

1. Звучит неплохо. Только одна проблема. Для первых 10 файлов их имена 00, 01, 02, 03,…. Вместо этого seq возвращает 0, 1, 2, 3.

2. Да, я видел это, когда вставлял результаты и обновлял, чтобы использовать seq-w ( заполнение нулей), чтобы исправить это

Ответ №2:

Поскольку все каталоги находятся всего на один уровень ниже, dir/ вы можете сделать это в bash :

 cd dir/
for d in [0-9][0-9]; do
   ((10#$d < 50)) amp;amp; echo "$d"
done | tar czf file1.tgz -T -
 

Подробные сведения:

  • for d in [0-9][0-9] : Будет соответствовать записям с 2 цифрами в текущей директории
  • ((10#$d < 50)) будет сравнивать каждое (базовое 10) имя каталога с 50 и вернет успех числа меньше, чем 50
  • tar czf file1.tgz -T - будет считывать имена каталогов из stdin и создавать один файл gzip tar file1.tgz .