Я хотел бы создать архив, содержащий файлы из каталога с 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.