перемещение файлов, содержащих часть строки из файла

У меня есть файл, в каждой строке которого есть строка некоторых чисел, например

1234
2345
...

Мне нужно переместить файлы, которые содержат этот номер в своем имени, за которым следуют другие вещи, в каталог, примеры которого

1234_hello_other_stuff_2334.pdf
2345_more_stuff_3343.pdf

Я пытался использовать xargs для этого, но мой сценарий bash не самый лучший. Может ли кто-нибудь поделиться правильной командой, чтобы выполнить то, что я хочу сделать?


person Eric Pigeon    schedule 06.03.2012    source источник


Ответы (3)


for i in `cat numbers.txt`; do
    mv ${i}_* examples
done

или (смотри ма, нет cat!)

while read i; do
    mv ${i}_* examples
done < numbers.txt
person Fred Foo    schedule 06.03.2012
comment
Я собирался использовать sed, но это намного элегантнее. - person Kevin; 06.03.2012
comment
Очень хорошо, хотя вам может понадобиться флаг -b на случай, если mv перезапишет. - person Spencer Rathbun; 06.03.2012

Вы можете использовать цикл for, но это может привести к очень длинной командной строке. Если у вас 20000 строк в файле numbers.txt, вы можете столкнуться с ограничениями оболочки. Вместо этого вы можете использовать канал:

cat numbers.txt | while read number; do
  mv ${number}_*.pdf /path/to/examples/
done

or:

sed 's/.*/mv -v &_*.pdf/' numbers.txt | sh

Вы можете оставить | sh для тестирования. Если в файле есть другие строки, и вы хотите сопоставить только строки с 4 цифрами, вы можете ограничить свое совпадение:

sed -r '/^[0-9]{4}$/s//mv -v &_*.pdf/' numbers.txt | sh
person Graham    schedule 06.03.2012

cat numbers.txt | xargs -n1 -I % find . -name '%*.pdf' -exec mv {} /path/to \;

% — это ваш номер (-n1 означает по одному), а от '%*.pdf' до find означает, что он будет соответствовать всем файлам, имена которых начинаются с этого номера; затем он просто копируется в /path/to ({} — фактическое имя файла).

person Manish    schedule 06.03.2012