Обратите внимание на то, что вывод, данный ls -l
и du
имеет тонкое, но очень важное различие. Попробуйте это:
dd if=/dev/urandom of=aaa bs=1024 count=1
Теперь
ls -l aaa
-rw-r--r-- 1 abc abc 1024 2012-03-08 15:45 aaa
Принимая во внимание, что
du -h aaa
4.0K aaa
Это вызвано тем, что файловая система выделяет размер в блоках 4 096 (на моем поле Linux). Это называют Блоком IO. Вы видите это:
stat aaa
File: `aaa'
Size: 1024 Blocks: 8 IO Block: 4096 regular file
Со статистикой GNU:
shopt -s dotglob
for file in dirA/*; do
[[ -f "dirB/${file##*/}" ]] || continue
if (( "$(stat -c %Y "$file")" > "$(stat -c %Y "dirB/${file##*/}")" )); then
# take action
fi
done
Bash, ksh, zsh и даже пепел имеют a -nt
оператор для [
встроенный (и в bash/ksh/zsh [[ … ]]
создайте), который тестирует, является ли файл более новым, чем другой.
for x in dirA/*; do
y=dirB/${x#*/}
if [ "$x" -nt "$y" ]; then
# The file in dirA is more recent
elif [ "$y" -nt "$x" ]
# The file in dirB is more recent
else
# The two files have the same modification time
# or the file doesn't exist in dirB
fi
done
Возможное решение с инструментами GNU:
find dirA dirB -type f -printf '%T@/%p\0' |
tr '\n\0\t/' '\0\n/\t' |
sort -k3 -k1,1rg |
uniq -f2 |
cut -f2- |
tr '\0/\t' '\n\t/'
Сообщил бы каждый файл и в dirA и в dirB (и их подкаталоги) за исключением того, что, если файл является характерным для обоих, только новейшим (или если они одного возраста, кто-либо из них наугад).
Тот единственные работы для значений dirA
и dirB
как "dirA"
, это, это не содержит пробел или режет символы, хотя нет никаких ограничений на пути файлов, которые они могут содержать.
С -type f
, только о регулярных файлах сообщают (не символьные ссылки, fifos, устройства...).
find
-printf
, g
тип вида, uniq
-f
опции и способность sort
, uniq
и cut
для преодоления символов NUL конкретный GNU.
zsh
,ksh93
иbash
иметь[[ file1 -nt file2 ]]
сравнить время изменения файла. Вы, возможно, также должны учесть то, что Вы хотите сделать с Большими символьными ссылками – Stéphane Chazelas 04.02.2013, 21:33stat -c %Y
округляет метку времени к целому числу секунд. – Gilles 'SO- stop being evil' 05.02.2013, 02:50