Поиск файлов рекурсивно и переименование по их полному пути - PullRequest
0 голосов
/ 10 января 2020

Я ищу для поиска файлов с указанным c именем, изменяю имя на полный путь и затем копирую результаты в другую папку.

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

./folder/subfolder/my-file.csv

становится

folder_subfolder_my-file.csv

Я перечисляю файлы с использованием следующего и хотел бы написать его.

find . -name my-file.csv -exec ls {} \;

Ответы [ 3 ]

1 голос
/ 10 января 2020

Поскольку вы используете bash, вы можете воспользоваться globstar и использовать for l oop:

shopt -s globstar # set globstar option
for csv in **/my-file.csv; do
  echo "$csv" "${csv//\//_}"
done

shopt -u globstar # unset the option if you don't want it any more

При включенном globstar, ** делает рекурсивный поиск (похож на базовую c функциональность find).

"${csv//\//_}" является примером ${var//match/replace}, который выполняет глобальную замену всех экземпляров match (здесь /) с replace.

Если вы довольны результатом, измените echo на mv.

0 голосов
/ 10 января 2020

Просто чтобы продемонстрировать, как это сделать с find;

find . -type f -exec bash -c '
    for file; do
        f=${file#./}
        cp "$file" "./${f//\//_}"
    done' _ {} +

Расширение шаблона Bash ${f//x/y} заменяет x на y повсюду. Поскольку find ставит перед каждым найденным файлом префикс пути, в котором он был найден (здесь ./), мы обрезаем его, чтобы избежать выполнения mv "./file" "._file". И поскольку sla sh используется в самом расширении параметра, нам нужно backsla sh sla sh, мы хотим, чтобы оболочка интерпретировалась буквально. Наконец, поскольку этот синтаксис расширения параметров является Bash -только расширением, мы используем bash вместо sh.

Очевидно, что если вы хотите переименовать, а не скопировать, замените cp на mv.

Если ваш find не поддерживает -exec ... +, это необходимо несколько изменить (возможно, для использования xargs); но это должно поддерживаться на любой достаточно современной платформе.

0 голосов
/ 10 января 2020

С помощью команды переименования perl ...

$ prename
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

... вы можете переименовать несколько файлов, применяя регулярное выражение. rename также принимает имена файлов через стандартный ввод:

find ... | rename -n 's#/#_#g'

Проверьте результаты и, если они в порядке, удалите -n.

...