найдите самые большие измененные в последний раз файлы/dirA/file,/dirB/file

Обратите внимание на то, что вывод, данный 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
4
04.02.2013, 11:48
3 ответа

Со статистикой 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
3
27.01.2020, 20:56
  • 1
    zsh, ksh93 и bash иметь [[ file1 -nt file2 ]] сравнить время изменения файла. Вы, возможно, также должны учесть то, что Вы хотите сделать с Большими символьными ссылками –  Stéphane Chazelas 04.02.2013, 21:33
  • 2
    Остерегайтесь этого, если метки времени поддержек файловой системы с reosolution лучше, чем 1 секунда, это перестанет работать, как stat -c %Y округляет метку времени к целому числу секунд. –  Gilles 'SO- stop being evil' 05.02.2013, 02:50

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
1
27.01.2020, 20:56

Возможное решение с инструментами 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.

0
27.01.2020, 20:56

Теги

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