Назад | Перейти на главную страницу

Возврат списка процитированных путей к файлам с помощью функции поиска

Я хотел бы создать архив, содержащий файлы из каталога с ctime менее 30 дней. Большинство найденных мною руководств в основном рекомендуют делать что-то вроде этого:

tar cvf foo.tar $(find ~/POD -type f -ctime -30)

Проблема в том, что многие файлы, которые я хочу удалить, содержат пробелы в своих именах. Это означает, что tar Команда будет разделена пробелами, что означает, что полные пути к файлам будут разбиты.

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

find . -type f -ctime -30  | xargs printf "\"%s\"\n"

Но эта команда также разбила все имена файлов на основе пробелов. Итак, я попробовал это:

oldifs=$IFS
IFS=\n
find . -type f -ctime -30  | xargs printf "\"%s\"\n"
IFS=$oldifs

Но это дало мне те же результаты.

Есть ли способ передать полные имена путей в tar и все ли работают с пробелами в именах?

GNU tar имеет -T возможность взять список файлов из указанного файла. я хотел бы использовать find ... -print0 | tar cfzT outfile.tgz - --null так tar получает имена файлов с завершающим нулем на stdin.

Выходной сигнал с завершающим нулем передается в tarпредложено geekosaur должен сработать, но вы также можете сделать это с помощью -exec вариант поиска. Find знает, что это сложная проблема, поэтому они ее решили, вам просто нужно повернуть все вспять по сравнению с тем, что вы сначала пытались сделать с tar … $(find …) и использовать find звонить tar вместо этого вот так:

find . -type f -ctime -30 -exec tar cfz outfile.tgz {} +

Вы почти получили это. Вам нужно экранировать \ n, например $ '\ n', чтобы присвоить переменной новую строку.

oifs=$IFS; IFS=$'\n'; tar cvf foo.tar $(find ~/POD -type f -ctime -30); IFS=$oifs

Дополнительную информацию см. В разделе «Цитирование» на странице руководства bash.