У меня есть несколько файлов в каталоге с именем IMG_0001.jpg
... IMG_9999.jpg
. Я хочу переместить в другой каталог файлы, которые имеют лексикографическое имя, которое больше IMG_9431.jpg
Как это сделать?
2 ответа
С расширением скобок, которое доступно в Bash 3 и выше, а также в Zsh и некоторых других оболочках:*
mv IMG_{9431..9999}.jpg some_other_dir
Скобки будут расширены до всех чисел от 9431 до 9999, так что это эквивалентно записи этого:
mv IMG_9431.jpg IMG_9432.jpg … IMG_9999.jpg some_other_dir
Это не удастся, если файлов слишком много (см. Этот пост о ARG_MAX
для справочной информации.)
Если в вашей оболочке отсутствуют функции расширения скобок или у вас слишком много файлов, вы можете сделать это - что может быть немного медленнее:
for n in $(seq 9431 9999); do mv "IMG_$n.jpg" some_other_dir; done
Если вы действительно хотите отсортировать лексикографически, взгляните на ответ Ярослава Рахматуллина. Гораздо приятнее, чем то, что следует здесь.
Вам придется как-то сортировать имена файлов. Это то, что я придумал очень быстро, и это не красиво и далеко не идеально. Он работает с GNU/Linux (grep
, sort
, xargs
) и работает с любыми именами файлов, включая кавычки и пробелы.
tmp="$(mktemp /tmp/files.XXX)"
find . -type f -name 'IMG*' -maxdepth 1 -print0 | sort -z > "$tmp"
line=$(grep -nz IMG_9984.jpg "$tmp" | cut -d: -f1)
tr '\0\n' '\n\0' < "$tmp" | tail -n "+$line" | tr '\0\n' '\n\0' |
xargs -0 -I{} echo mv {} some_other_dir
rm "$tmp"
Удалите echo
когда вы уверены, что это делает то, что вы хотите. Что мы делаем здесь:
Создайте временный файл для хранения имен файлов.
Найдите все файлы, соответствующие шаблону, и отсортируйте их во временный файл. Записи разделяются символами
NUL
(-print0
,-z
), поэтому мы можем иметь дело с любым именем файла.Найдите номер строки в имени файла, например,
IMG_9984.jpg
Поменяйте местами
NUL
и символ новой строки во временном файле, чтобыtail
мог с ним справиться.Поменяйте их местами, чтобы
xargs
мог справиться с этим (-0
), иmv
файлы в другой каталог.
Это было бы проще, если бы нам не приходилось иметь дело с файлами, которые содержат кавычки или пробелы, но ... это только я. Лучше быть в безопасности, чем потом сожалеть.
Вы можете использовать sort
и sed
чтобы получить список файлов размером больше, чем строка:
$ ls -v
0?#Li 23?24 E.See NULib Yoush ce-Su edint ethat ibble itwil lines of16 plesA ryGen t6?#C witht #ver
0?#mo 25?i Examp NYWAR along cribb edist ev ibrar ix B. mapfo ofthe ppend sdist tetot y8?#9 (atyo
0,22 27?# FORAP NextA areFo dacop edwar frees ic11 lPubl mored oftwa publi sefor theGN yGene )1995
1.scr 02111 Finla Peter aryis datio eful, ftheG ight( landJ mport on23# ralPu se,or tunde yofth ,USA.
1-200 ARTIC GIMPT RANTY avere difyi eitan ftwar imbal lbeus ncerK on,MA raryG shedb t,wri ytheF ;ifno
2John Appen HANTA Softw bleof dix B enera ght(C impli ld7?# nc.,5 oolki raryi simpl ublic #19?# ;with
4?#Th BILIT HOUTA TNESS blic2 e.py4 enthe gtk26 ingar lePla ngpix opyri rdraw sion. ucanr #Bost Code
5?#GT Backi K-The U17?# brary e.pyB eralP he21 ion)a lesPr nseas oshMa reeSo sion2 undat #Free
9Temp Conte Libra ULARP cDona eExam ermso hehop ion,I lesTa ntsB. ouldh re;yo slibr uropt #Lice
13?#1 Copyr Licen URPOS ceive eFoun erver her12 islib lescr nylat outev ribut s,Spe utWIT #MERC
15?#b C)200 Matti YorFI cense eGNUL etail hisli ite33 lesim n;eit ple.p rthet s.18 vpyth #Thi
$ mkdir greater-than-sion
Вот магия:
$ find -type f -print0 |
sort -z |
sed -z '1,/sion/d' |
xargs -0 mv -t greater-than-sion
линии:
- вывести список файлов, разделенных
NUL
вместо новых строк (-print0
) - сортировать их
- удалить строки ниже (включительно) некоторой строки (здесь
sion
) - обратите внимание, что это работает только с GNUsed
, которая реализует опцию-z
для анализаNUL
определяемого ввода - передать этот список
mv
сxargs
И желаемый результат:
$ ls -R
.:
Code ;ifno 25?i avere Conte edist erver GIMPT ic11 K-The lines nseas opyri raryG se,or
#19?# ;with 27?# Backi Copyr edwar etail greater-than-sion/ ight( landJ lPubl ntsB. oshMa raryi sefor
#Bost 0?#Li 2John BILIT cribb eExam ethat gtk26 imbal lbeus mapfo NULib ouldh rdraw shedb
#Free 0?#mo 4?#Th bleof dacop eFoun ev HANTA impli ld7?# Matti nylat outev re;yo simpl
#Lice 0,22 5?#GT blic2 datio eful, Examp he21 ingar lePla mored NYWAR Peter reeSo sion.
#MERC 02111 9Temp brary difyi eGNUL Finla hehop ion)a lescr mport of16 ple.p ribut
#Thi 1.scr along C)200 dix B eitan FORAP her12 ion,I lesim n;eit ofthe plesA rthet
#ver 1-200 Appen cDona e.py4 enera frees hisli islib lesPr nc.,5 oftwa ppend ryGen
(atyo 13?#1 areFo ceive e.pyB enthe ftheG HOUTA ite33 lesTa ncerK on,MA publi s,Spe
)1995 15?#b ARTIC cense E.See eralP ftwar ibble itwil Libra NextA on23# ralPu s.18
,USA. 23?24 aryis ce-Su edint ermso ght(C ibrar ix B. Licen ngpix oolki RANTY sdist
./greater-than-sion:
sion2 Softw t6?#C theGN tunde ublic ULARP uropt utWIT witht yGene YorFI ytheF
slibr t,wri tetot TNESS U17?# ucanr undat URPOS vpyth y8?#9 yofth Yoush