Переименуйте файлы в нескольких каталогах в имя каталога

У меня есть что-то вроде этого:

v_1/file.txt
v_2/file.txt
v_3/file.txt
...

и я хочу переименовать эти файлы в нечто вроде этого:

v_1.txt
v_2.txt
v_3.txt
...

в том же каталоге.

Я думаю, я могу использовать rename но я не могу понять, как использовать его с переименованием папок и файлов одновременно.

3 ответа

Решение

Результат может быть достигнут с помощью bash for loop и mv:

for subdir in *; do mv $subdir/file.txt $subdir.txt; done;

Обратите внимание, что решение выше не будет работать, если имя каталога содержит пробелы. Ссылка по ссылке.

Другое решение, основанное на комментариях (это работает для каталогов, имеющих также пробелы в имени):

find . -type d -not -empty -exec echo mv \{\}/file.txt \{\}.txt \;

Вы можете использовать RNM. Команда будет:

rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' /path/to/the/directory

-fo подразумевает режим только для файлов.

-dp глубина каталога. -1 делает его рекурсивным для всех подкаталогов.

-ns подразумевает строку имени, т.е. новое имя файла.

/pd0/ является непосредственным родительским каталогом файла, который подлежит операции переименования.

-ss это строка поиска (регулярное выражение). '\.txt$' регулярное выражение ищет файл с .txt в конце имени файла.

/path/to/the/directory это путь к каталогам v_1, v_2 ... Вы также можете передать каталоги ( v_1, v_2 ...) вместо пути родительского каталога. Например:

#from inside the parent directory
rnm -fo -dp -1  -ns '/pd0/.txt' -ss '\.txt$' v_* 

Кажется довольно простым для меня:

$ mkdir /tmp/sandbox
$ cd /tmp/sandbox

$ mkdir v_{1,2,3}
$ touch v_{1,2,3}/file.txt

$ rename -v 's#/file##' v_{1,2,3}/file.txt
rename v_1/file.txt v_1.txt
rename v_2/file.txt v_2.txt
rename v_3/file.txt v_3.txt

$ ls -F
v_1/  v_1.txt    v_2/  v_2.txt    v_3/  v_3.txt
Другие вопросы по тегам