Переименуйте файлы в нескольких каталогах в имя каталога
У меня есть что-то вроде этого:
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