Пробельные проблемы со сценарием и переменными

Я пытаюсь бить головой о синтаксис этого. Я получаю проблемы с пробелами, и я не вижу, существует ли лучший способ сделать это.

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 текущие для восстановления исходных измененных дат.

1
задан 9 February 2015 в 15:12

2 ответа

Поскольку другие люди сказали передо мной: не анализируйте вывод 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).

6
ответ дан 3 December 2019 в 06:20

Не анализируйте вывод ls, используйте шарик:

for i in * ; do

кроме того, заключите в кавычки переменные, которые могли бы содержать пробелы:

    timestamp=$(stat -c %y "$i")
4
ответ дан 10 November 2019 в 08:02

Другие вопросы по тегам:

Похожие вопросы: