Я пытаюсь бить головой о синтаксис этого. Я получаю проблемы с пробелами, и я не вижу, существует ли лучший способ сделать это.
vardir=/home/user
cd $vardir
for i in $(ls "$vardir") ; do
timestamp="$(stat -c %Y $i)"
echo "$i"
echo "$timestamp"
done
Результат подобен, неважно, где я заключаю в кавычки, и я не уверен, что я делаю неправильно:
stat: cannot stat ‘Temporary’: No such file or directory
Temporary
stat: cannot stat ‘Items’: No such file or directory
Items
Моя цель, я хочу захватить метки времени прочь резервных каталогов и touch
текущие для восстановления исходных измененных дат.
Поскольку другие люди сказали передо мной: не анализируйте вывод ls
!
Почему не просто:
stat --printf='%y\t%n\n' -- *
Если Вы хотите сделать что-то с каждым именем файла и меткой времени, read
вывод stat
как это:
stat --printf='%y\t%n\0' -- * | \
while IFS=$'\t' read -rd '' timestamp i; do
echo "filename: ${i}, timestamp: ${timestamp}"
done
Никакая потребность породить новое stat
процесс для каждого файла, который Вы заметите, как только Вы порождаете несколько сотен процессов для нескольких сотен файлов.
Для более сложных соответствий, чем простой globbing я рекомендую find
с подходящим -printf
опция.
Править: Согласно комментариям к этому ответу, я узнал, что OP на самом деле хочет скопировать штампы времени изменения из файлов одного каталога другому. Это - то, что я предлагаю:
for f in /source/dir/*; do
touch -c -r "${f}" "/dest/dir/${f##*/}"
done
Это берет все записи от /source/dir
как ссылки метки времени (-r
) для записей того же имени файла в /dest/dir
не создавая новые файлы, которые не существуют в /dest/dir
все же (-c
).
Не анализируйте вывод ls
, используйте шарик:
for i in * ; do
кроме того, заключите в кавычки переменные, которые могли бы содержать пробелы:
timestamp=$(stat -c %y "$i")