Показать хвост файлов в каталоге?

Вместо выполнения mv /home/ketan/hex/foo /home/maxi, необходимо будет варьироваться целевой каталог на основе пути, произведенного find. Это легче, если Вы изменяетесь на исходный каталог сначала и работаете find .. Теперь можно просто предварительно ожидать целевой каталог к каждому объекту, произведенному find. Необходимо будет выполнить оболочку в find … -exec команда, чтобы выполнить конкатенацию и создать целевой каталог при необходимости.

destination=$(cd -- "$destination" && pwd) # make it an absolute path
cd -- "$source" &&
find . -type f -mtime "-$days" -exec sh -c '
  mkdir -p "$0/${1%/*}"
  mv "$1" "$0/$1"
' "$destination" {} \;

Обратите внимание что постараться не заключать проблемы в кавычки если $destination содержит специальные символы, Вы не можете только заменить им в сценарии оболочки. Можно экспортировать его в среду так, чтобы это достигло внутренней оболочки, или можно передать его как аргумент (это - то, что я сделал). Вы могли бы сохранить немного времени выполнения путем группировки sh вызовы:

destination=$(cd -- "$destination" && pwd) # make it an absolute path
cd -- "$source" &&
find . -type f -mtime "-$days" -exec sh -c '
  for x do
    mkdir -p "$0/${x%/*}"
    mv "$x" "$0/$x"
  done
' "$destination" {} +

С другой стороны, в zsh, можно использовать zmv функция, и . и m спецификаторы шарика, чтобы только соответствовать регулярным файлам в правильном диапазоне дат. Необходимо будет передать альтернативу mv функция, которая сначала создает целевой каталог при необходимости.

autoload -U zmv
mkdir_mv () {
  mkdir -p -- $3:h
  mv -- $2 $3
}
zmv -Qw -p mkdir_mv $source/'**/*(.m-'$days')' '$destination/$1$2'

5
29.11.2013, 01:21
2 ответа

Запрет Ваших файлов не включает странные символы в их имена, такие как пробелы, новые строки, и т.д. Простой канал к tail -n 200 должен быть достаточным.

Пример

Демонстрационные данные.

$ touch $(seq 300)

Теперь последние 200:

$ ls -l | tail -n 200

Вам не мог бы понравиться способ, которым результаты представлены в том списке 200. Для этого можно управлять порядком результатов это ls выводы через множество переключателей. Например, данные, которые я генерировал, являются числовыми. Используя вышеупомянутый метод как результаты показывают так:

$ ls -l | tail -n 12
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 89
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 9
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 90
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 91
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 92
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 93
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 94
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 95
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 96
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 97
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 98
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 99

Но возможно Вы хотите это в истинном числовом порядке, таким образом, Вы могли использовать -v переключатель:

$ ls -lv | tail -n 12
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 289
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 290
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 291
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 292
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 293
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 294
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 295
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 296
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 297
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 298
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 299
-rw-rw-r-- 1 saml saml 0 Nov 28 11:50 300

Необходимо обратить особое внимание на ls реализации, так как некоторые могут включать один переключатель, в то время как другой не может. Консультируйтесь со страницами справочника по поводу соответствующих систем для получения полного списка доступных переключателей.

7
27.01.2020, 20:37

В zsh:

print -lr -- *([1,200])          # print the name of the first 200 files in alphabetical order
print -lr -- *(om[1,200])        # print the name of the 200 most recent files
print -lr -- *(oN[1,200])        # print the name of 200 files

oN вариант читает файлы в порядке каталога, таким образом, он не напрасно тратит время, сортируя их.

Если Вы хотите посмотреть на содержание файла также:

tail *(oN[1,200])

С любой оболочкой, для печати названий 200 файлов, не читая все имена файлов и сортируя их:

ls -lU | head -n 200

Распечатать названия 200 новых файлов:

ls -lt | head -n 200

Если Вы хотите переместить файлы в набор каталогов, посмотрите, что Пакет копирует в несколько каталогов, Как я могу найти файлы и затем использовать xargs для перемещения их?, файлы копирования/перемещения Пакета в Unix?, перемещение Пакетного файла к структуре каталогов на основе имени файла

1
27.01.2020, 20:37

Теги

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