web-dev-qa-db-ja.com

複数のディレクトリ内のファイルの名前をディレクトリの名前に変更します

私はこのようなものを持っています:

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

これらのファイルの名前を次のような名前に変更したいと思います。

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

同じディレクトリにあります。

renameを使用できると思いますが、フォルダーとファイルの名前変更を同時に使用する方法がわかりません。

15
giskou

結果は、bashforループとmvで実現できます。

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

ディレクトリ名にスペースが含まれている場合、上記の解決策は機能しないことに注意してください。関連 リンク

コメントに基づく別の解決策(名前にスペースが含まれるディレクトリでも機能します):

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

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_* 
1
Jahid

私にはかなり簡単に思えます:

$ 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
0
tchrist