Чё-то туплю. Народ, кому-нить попадался пример скрипта на bash, который бы рекурсивно обходил директории, обрабатывал находящиеся там файлы, при этом результат обработки файлов сохранял бы в другой директории с сохранением структуры исходных каталогов? Это актуально, например, при массовом перекодировании медиа.
Tags:
no subject
?
Не пробовал.
no subject
no subject
# Программа вызывается с 2-мя аргументами
# PROGRAM in-file out-file
IN_DIR=$1/
OUT_DIR=$2/
PROGRAM=$3
# создаём структуру каталогов
for d in `find "$IN_DIR" -type d`; do
mkdir -p `echo $d | sed s%"$IN_DIR"%"$OUT_DIR"%`
done
for i in `find $IN_DIR -type f`; do
echo $i
$PROGRAM $i `echo $i | sed s%"$IN_DIR"%"$OUT_DIR"%`
done
no subject
Тут надо делать наоборот - перенаправлять find на xargs. А уже оттуда - запускать скрипт, который работает со своими аргументами.
find $IN_DIR -type d -print0 | xargs -0 do_something.sh "$PROGRAM" "$IN_DIR" "$OUT_DIR"
do_something аналогична вашему скрипту, только работает на аргументах.
no subject
#!/bin/bash fargs="-c:a copy -vn" IFS=$'\n' for file in $(find $1 -type f -iname '*.mp4' -printf "%p\n") do src_dir_abs=$(realpath $1) filename=$(realpath $file) dst_file=$(realpath --relative-base $src_dir_abs $filename) dst_dir=$(dirname $dst_file) dst_dir=$2/$dst_dir mkdir -p $dst_dir dst_file=$(basename $dst_file) dst_file=${dst_file%.*}.m4a args=$fargs\ \"$dst_dir/$dst_file\" eval "ffmpeg -i \"$filename\" $args" doneno subject
while read file
do
< тело цикла из for >
done < $(find $1 -type f -iname '*.mp4' -printf "%p\n")
Что-то вроде этого.
Мой вариант сперва ищет каталоги, потом создаёт их, а затем пробегает по файлам, избегая повторных mkdir -p, но это очень быстрая команда. Короче, ваш вариант ничуть не хуже моего. И он 100% заточен под вашу задачу.
Я и был уверен, что он не вполне подходит к вашей задаче, т.к. создание полного Т.З. для таких скриптов занимает больше, чем время написания скрипта.
P.S.
sed s/// заменяет одну подстроку на другую. Самая удобная команда. Т.е.
echo "Привет котлет!" | sed s/Привет/Пока/
выдаст
"Пока котлет!"
Причём / можно заменить на любой другой символ. Типа sed s%a%b%
no subject
Тут, надо сказать, оказалось некоторое количество подводных камней. Типа отработки пробелов в именах. Но главное, меня, например, доканала обработка корневого каталога и ./ и ../, потому что они всю красоту рушат. А баш меня изумил тем, насколько всё делается через одно место. С одной стороны наворочено много чего, с другой — для элементарных действий надо с бубном плясать.
no subject
no subject
no subject
При этом, в отличие от xargs, вам не надо писать отдельный скрипт + интерпретатор bash, который иногда оказывается слишком жирным, запускается ровно один раз, а не на каждый файл.
А в for список файлов формируется заранее, поэтому может упереться в размер какого-то буфера. Но это должно быть очень много файлов, у вас вряд ли столько.
Но, в целом, такие скрипты делаются по месту, поэтому никто их не пишет "навсегда".
no subject
no subject
С седом только не силён. Не очень понял что он делает.
И, кстати, на именах каталогов с пробелами чудит.