Вместо выполнения 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'
Запрет Ваших файлов не включает странные символы в их имена, такие как пробелы, новые строки, и т.д. Простой канал к 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
реализации, так как некоторые могут включать один переключатель, в то время как другой не может. Консультируйтесь со страницами справочника по поводу соответствующих систем для получения полного списка доступных переключателей.
В 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?, перемещение Пакетного файла к структуре каталогов на основе имени файла