Скопировать все файлы из подкаталогов и подподкаталогов в главный каталог, изменив имена файлов, добавив префиксы всех родительских каталогов.

Скопировать все файлы из подкаталогов и подподкаталогов в главный каталог, изменив имена файлов, добавив префиксы всех родительских каталогов.

После этих двух постов:

https://askubuntu.com/questions/871898/переместить-файлы-в-родительский-каталог-префикс-имя-файла-с-бывшим-названием-подкаталога

https://askubuntu.com/questions/870844/recursively-add-directory-name-to-file-name

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

Я работаю на Ubuntu 16.04

решение1

Пытаться:

find  -name "*.dat" -exec bash -c 'echo cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"' tinyscript {} \;

(уберите «эхо», если команды выглядят хорошо)

.
└── 1
    └── 2
        ├── 3
        │   └── 4
        │       └── foo.dat
        └── foo.dat

Урожайность:

cp ./1/2/3/4/foo.dat ./1-2-3-4-foo.dat
cp ./1/2/foo.dat ./1-2-foo.dat

По сути, вы запускаете небольшой специальный скрипт ( cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"для каждого совпадающего файла, и этот скрипт генерирует целевое имя, заменяя все /в исходном пути на -. tinyscriptСтрока может быть любой, это просто имя, которое используется в качестве имени скрипта в случае ошибок.

решение2

Предпочитая простоту производительности, это не особенно эффективно (из-за запуска процесса bash для каждого файла). Если у вас много файлов и/или время является фактором, может потребоваться более сложное решение.

find yourdirectory/ -type f -print0 | xargs -0 -I% bash -c 'F="%" ; echo cp "${F}" "${F//\//-}"'

Связанный контент