Переименуйте файлы в нескольких каталогах на имя каталога
У меня есть что-то вроде этого:
v_1/file.txt
v_2/file.txt
v_3/file.txt
...
и я хочу переименовать эти файлы примерно так:
v_1.txt
v_2.txt
v_3.txt
...
в том же каталоге.
Я предполагаю, что могу использовать rename
, но я не могу понять, как использовать его с переименованием папок и файлов одновременно.
Ответы
Ответ 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_*