Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Похоже, мне очень легко:

$ 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

Ответ 3

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

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

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

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

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

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

-ss - строка поиска (регулярное выражение). '\.txt$' regex ищет файл с .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_*