私はこのようなものを持っています:
v_1/file.txt
v_2/file.txt
v_3/file.txt
...
これらのファイルの名前を次のような名前に変更したいと思います。
v_1.txt
v_2.txt
v_3.txt
...
同じディレクトリにあります。
rename
を使用できると思いますが、フォルダーとファイルの名前変更を同時に使用する方法がわかりません。
結果は、bashforループと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$'
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_*
私にはかなり簡単に思えます:
$ 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