#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 tarfile1.tgz
.