Bash - переименование файлов с префиксом перед перемещением в одну папку

Используя bash, как я могу найти все файлы в подкаталогах с расширением .txt, префикс имени с именем каталога? Затем переместить все эти файлы .txt в одну папку в текущем каталоге?

Пример:

\subdirectory1\result1.txt  
\subdirectory1\result2.txt  
\subdirectory2\result1.txt  
\subdirectory2\result2.txt  
\subdirectory3\result1.txt  
\subdirectory3\result2.txt  

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

\newfolder\subdirectory1_result1.txt  
\newfolder\subdirectory1_result2.txt    
\newfolder\subdirectory2_result1.txt    
\newfolder\subdirectory2_result2.txt    
\newfolder\subdirectory3_result1.txt  
\newfolder\subdirectory3_result2.txt

person Carl Kennedy    schedule 16.08.2017    source источник
comment
добавь еще примеры   -  person sumitya    schedule 16.08.2017


Ответы (3)


Учитывая, что ваши исходные файлы находятся в иерархии каталогов src, и вы хотите переместить их в целевой каталог target:

for f in $(find src -type f -name \*.txt) # select all files in src
do
    d=$(dirname $f | sed 's/\//-/g')   # extract directory part of path and subsitute / with -
    mv "$f" target/"$d"-$(basename $f) # move to target dir
done
person King Thrushbeard    schedule 16.08.2017
comment
Спасибо. Это отлично работает для папки с одним именем. Я внес несколько изменений, и теперь он делает именно то, что мне нужно. for i in *; do for f in $(find $i -type f -name \*.txt) # select all files in src do d=$(dirname $f | sed 's/\//-/g') # extract directory part of path and subsitute / with - cp "$f" target/"$d"-$(basename $f) # move to target dir done done - person Carl Kennedy; 16.08.2017
comment
@CarlKennedy Я вижу, 1. у вас есть несколько исходных каталогов (не один) и 2. вы хотите копировать, а не перемещать. Надеюсь, вы нашли мой ответ полезным, тем не менее. - person King Thrushbeard; 16.08.2017

find <subdirectory> -name "*.txt" | awk -v newfolder="somefolder" -F\/ '{ system("mv "$(NF-1)$NF" "newfolder) }'

Используя awk, перечислите файлы с расширением txt, а затем используйте поле awk, разделенное с помощью «/», чтобы создать команду mv, выполняемую через системную функцию awk. переданная переменная newfolder содержит путь для перемещения файлов.

Существуют риски, связанные с внедрением этого решения awk, но, тем не менее, это вариант.

person Raman Sailopal    schedule 16.08.2017

Очень простое решение с использованием поиска и объединения с mv

find <currentDirToSearch> -name "*.txt" -exec mv {} <destinationDir> \;

пример

find . -name "*.txt" -exec mv {} dirToMove \;
person nagendra547    schedule 16.08.2017