Рекурсивно перемещая все файлы определенного типа в целевой каталог в Bash

Как я могу переместить все .txt файлы из папки и всех включенных папок в целевой каталог.

И желательно переименовать их в папку, где они включены, хотя это не так важно. Я не совсем знаком с bash.

Ответ 1

Чтобы рекурсивно перемещать файлы, объедините find с mv.

find src/dir/ -name '*.txt' -exec mv {} target/dir/ \;

Чтобы переименовать файлы при их перемещении, это сложнее. Один из способов - создать цикл, который передает каждое имя файла через tr / _, который преобразует косые черты в символы подчеркивания.

find src/dir/ -name '*.txt' | while read file; do
    mv "$file" "target/dir/$(tr / _ <<< "$file")"
done

Ответ 2

Попробуйте следующее:

find source -name '*.txt' | xargs -I files mv files target

Это будет работать быстрее, чем любая опция с -exec, поскольку она не будет вызывать синхронный процесс mv для каждого файла, который нужно переместить.

Ответ 3

Если это только один уровень:

mv *.txt */*.txt target/directory/somewhere/.