
После этих двух постов:
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//\//-}"'