Как переместить / скопировать много файлов (не всех файлов) в каталог? - PullRequest
1 голос
/ 05 апреля 2011

Я получил каталог, который содержит около 9000 файлов, имена файлов указаны по возрастанию (но не обязательно подряд).

Теперь мне нужно скопировать / переместить ~ 3000 файлов с номера xxxx на номер yyyy в другую директорию. Как я могу использовать команду cp или mv для этой цели?

Ответы [ 3 ]

3 голосов
/ 05 апреля 2011
find -type f | while read file; do if [ "$file" -ge xxxx -o "$file" -le yyyy ]; then echo $file; fi; done | xargs cp -t /destination/

Если вы хотите ограничить до 3000 файлов, выполните:

export i=0; find -type f | while read file; do if [ "$file" -ge xxxx -o "$file" -le yyyy ]; then echo $file; let i+=1; fi; if [ $i -gt 3000 ]; then break; fi; done | xargs cp -t /destination/

Если файлы имеют общий суффикс после номера, используйте $ {file %% суффикс} внутри if (youможно использовать глобусы в суффиксе).

1 голос
/ 05 апреля 2011

Вы можете использовать утилиту seq для генерации чисел для операций такого типа:

for i in `seq 4073 7843` ; do cp file_${i}_name.png /destination/folder ; done

С другой стороны, cp будет выполняться намного чаще, чем решение QuantumMechanic;но решение QuantumMechanic может не выполняться, если общая длина всех имен файлов превышает ограничение размера ядра argv (которое может быть между 128 КБ и 2048 КБ, в зависимости от версии вашего ядра и ограничений размера стека; подробности см. execve(2))).

Если требуемый диапазон охватывает порядки величин (например, между 900 и 1010), тогда может быть полезна опция seq -w, она обнуляет выходные значения.

1 голос
/ 05 апреля 2011

Это не самый элегантный, но как насчет чего-то вроде:

cp 462[5-9] 46[3-9]? 4[7-9]?? 5??? 6[0-2]?? 63[0-4]? 635[0-3]  otherDirectory

, который будет копировать файлы с именами 4625 до 6353 включительно в otherDirectory.(Вы не захотите использовать что-то вроде 4*, так как это скопирует файл 4, 42, 483 и т. Д.)

...