Переименование нескольких файлов во вложенной структуре - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть каталог с такой структурой:

root
|-dir1
| |-pred_20181231.csv
|
|-dir2
| |-pred_20181234.csv
...
|-dir84
  |-pred_2018123256.csv

Я хочу запустить команду, которая переименует все файлы pred_XXX.csv в pred.csv.

Как я могу легкодобиться этого?

Я изучил средство переименования , но я не понимаю синтаксис выражения perl.

РЕДАКТИРОВАТЬ: я пытался с этим кодом: rename -n 's/\training_*.csv$/\training_history.csv/' *.csv, ноне сработало

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Используйте некоторые циклы оболочки:

for file in **/*.csv
do
    echo mv "$(dirname "$file")/$(basename "$file")" "$(dirname "$file")/pred.csv"
done

В современных оболочках ** - это подстановочный знак, который соответствует нескольким каталогам в иерархии, альтернатива find, что также является хорошим решением.Я не уверен, что вместо этого должно быть /**/*.csv или /root/**/*.csv на основе предоставленного вами дерева, поэтому я поставил echo перед 'mv', чтобы увидеть, что он собирается делать.Убедившись, что это будет делать то, что вы ожидаете, удалите echo.

0 голосов
/ 30 декабря 2018

Попробуйте с помощью этой команды:

find root -type f -name "*.csv" -exec perl-rename 's/_\d+(\.csv)/$1/g' '{}' \;

Используемые параметры :

  • -type f для указания файла или каталога.
  • -name "*.csv" для сопоставления только файлов с расширением csv
  • -exec\-execdir для выполнения команды, в этом случае perl-rename
  • 's/_\d+(\.csv)/$1/g' поиск строки типа _20181234.csv изамените его на .csv, $1 означает, что найдена первая группа.

ПРИМЕЧАНИЕ

В зависимости от вашего SO вы можете использовать только rename вместоperl-rename.

...