Bash: перемещение нескольких файлов во вложенные папки

У меня есть папка с парой тысяч файлов, и я хочу переместить их во вложенные папки в соответствии со строкой в ​​имени файла. Все файлы имеют такую ​​структуру, как

что-то-run1_001.txt

что-то-run22_1243.txt

Итак, я попробовал следующий сценарий, чтобы переместить все файлы с "run1" в подпапку r1 и все файлы "run22" в подпапку r22 (и так далее), но это не работает, и я получаю сообщение " Файл X - это то же самое, что и файл X ».

#!bin/bash

for i in {1..39}
do
foldername=r$i
#echo "$foldername"
mkdir $foldername
find . -type f -name "*run$i_*" | xargs -i mv {} $foldername/ 
done

Как это решить?


person Martin H    schedule 04.05.2011    source источник


Ответы (3)


эта работа является вашим требованием?

mv *run*.html dir1

person Nirmal- thInk beYond    schedule 04.05.2011

Если вы по-прежнему сталкиваетесь с ловушкой "слишком много аргументов", вы можете перенаправить find в цикл while.

#!/bin/bash -u
find . -maxdepth 1 -name '*-run*_*.txt' |
{
    while read FNAME
    do
        N=${FNAME##*-run}
        N=${N%_*}
        DIR=r$N
        test -d $DIR || mkdir $DIR
        mv $FNAME $DIR/.
    done
}
person Sodved    schedule 04.05.2011
comment
Я думаю, что причина, по которой я столкнулся с этим в первую очередь, заключается в том, что я не использовал $ {i} с дополнительным {}. Я тщательно это тестировал, так как решение Эрика помогло. find - это действительно мощная вещь, я, вероятно, должен немного прочитать об этом ... - person Martin H; 04.05.2011

person    schedule
comment
Так просто ... Я пробовал нечто подобное (но не то же самое) раньше и столкнулся с ловушкой слишком большого количества аргументов. - person Martin H; 04.05.2011