2016-08-12 2 views
0

У меня есть папка с файлами около 7000, и мне нужно скопировать или переместить после первых x файлов в другую папку.скопируйте файлы x из папки в другую

мой текущий простой скрипт:

for file in $(ls -p | grep -v/| tail -100) 
    do 
    echo $file 
    cp $file "/other /Folder" 

done 

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

+2

Вам нужно процитировать $ файл, например "$ file" – user3439894

+0

Я согласен с @ user3439894. Пробелы или любые специальные символы не будут работать с вашим скриптом. Как правило, не анализируйте вывод ls. Параметр и подстановки команд должны быть двойными. – 0x23212f

ответ

2

Вы также можете использовать простой цикл for и count, чтобы пропустить первое число count и переместить остальные, например. пропуская первые 3 файлы (или папки):

$ skip=3; for i in *; do ((skip > 0)) && { ((skip--)); continue; }; mv "$i" "$destdir"; done 

или, в виде сценария:

skip=3 
for i in *; do 
    ((skip > 0)) && { ((skip--)); continue; } 
    mv "$i" "$destdir" 
done 
+0

странное значение пропуска не меняется там .... – marciton

+0

Хм. что странно, какой OS/shell вы используете? Не имеет значения, как используется арифметическая обработка и сравнение POSIX. Вы можете попробовать '[" $ skip "-gt '0'] && {skip = $ (expr" $ skip "- 1); Продолжать; } ', если ваша платформа испытывает трудности с записью POSIX' ((...)) '. (убедитесь, что * пробелы в 'expr" $ skip "- 1', если вы идете по этому маршруту). Вы также можете попробовать * намекнуть * на оболочку, что' skip' является 'integer' с' declare -i skip' для начала или попробуйте 'skip = $ ((skip-1))' вместо '((skip -))' –

+0

Он отлично работает в OS X El Capitan 10.11.5: 'BASH_VERSION = '3.2.57 (1) -release'' – user3439894

Смежные вопросы