Как перемещать и нумеровать файлы?

Работаю с линуксом, баш.

У меня есть один каталог с 100 папками, каждая из которых имеет свое имя.

В каждой из этих 100 папок есть файл с именем first.bars (так что у меня есть 100 файлов с именем first.bars). Хотя все они называются first.bars, на самом деле файлы немного отличаются.

Я хочу, чтобы все эти файлы были перемещены в одну новую папку и переименовали/нумеровали эти файлы, чтобы я знал, какой файл из какой папки. Таким образом, первый файл first.bars нужно переименовать в 001.bars, второй — в 002.bars и т. д.

Я пробовал следующее:

ls -d * >> /home/directorywiththe100folders/list.txt
cat list.txt | while read line;
do cd $line;
mv first.bars /home/newfolder

Это не работает, потому что я не могу иметь 100 файлов с одинаковыми именами в одной папке. Поэтому мне нужно только знать, как их переименовать. Переименование должно быть связано с катом list.txt, так как первая строка — это папка, содержащая первый перемещаемый и переименовываемый файл. Этот файл будет называться 001.bars.


person rubano    schedule 18.03.2013    source источник


Ответы (2)


Попробуйте сделать это:

$ rename 's/^.*?\./sprintf("%03d.", $c++)/e' *.bar

Если вам нужна дополнительная информация об этой команде, см. этот недавний ответ, который я дал ранее: Как переименовать несколько файлов, начинающихся с временной метки Unix – проблема imapsync

person Gilles Quenot    schedule 18.03.2013
comment
Я не могу заставить это работать. Сначала я попробовал включить его в свой собственный код, но это не сработало. Затем я попробовал это в одной папке (одной из этих 100) и попытался переименовать файл first.bar с вашим кодом. К сожалению, ничего не происходит. Rename просит меня дать 3 входа: from, to и file. *.bar, очевидно, файл, но я думаю, что он не распознает от и до. - person rubano; 18.03.2013
comment
@rubano: я слишком предполагаю, что вы не прочитали мою ссылку! Особенно часть примечания. - person Gilles Quenot; 19.03.2013
comment
Я действительно прочитал вашу ссылку, но это не помогло (сначала). Но в конце концов я заставил его работать. Спасибо большое Спутник! - person rubano; 26.03.2013

Если команда rename недоступна,

for d in /home/directorywiththe100folders/*/; do
    newfile=$(printf "/home/newfolder/%d.bars" $(( c++ )) )
    mv "$d/first.bars" "$newfile"
done
person chepner    schedule 18.03.2013