2012-03-06 2 views
2

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

1234 
2345 
... 

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

1234_hello_other_stuff_2334.pdf 
2345_more_stuff_3343.pdf 

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

ответ

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

или (вид ма, не cat!)

while read i; do 
    mv ${i}_* examples 
done < numbers.txt 
+0

Я собирался использовать 'sed', но это намного более элегантно. – Kevin

+0

Очень приятно, хотя вам может понадобиться флаг '-b', если' mv' выполняет некоторую перезапись. –

2

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

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

или:

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

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

sed -r '/^[0-9]{4}$/s//mv -v &_*.pdf/' numbers.txt | sh 
2
cat numbers.txt | xargs -n1 -I % find . -name '%*.pdf' -exec mv {} /path/to \; 

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

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