0

私は次のようなフォルダとファイル構造を持っています


Folder/1/fileNameOne.ext
Folder/2/fileNameTwo.ext
Folder/3/fileNameThree.ext
...

出力が次のようになるようにファイルの名前を変更するにはどうすればよいですか


Folder/1_fileNameOne.ext
Folder/2_fileNameTwo.ext
Folder/3_fileNameThree.ext
...

Linuxシェルでこれをどのように達成できますか?

4

4 に答える 4

2

次のようにループを使用します。

while IFS= read -d $'\0' -r line
do
    mv "$line" "${line%/*}_${line##*/}"
done < <(find Folder -type f -print0)

このメソッドは、ファイル名のスペース、改行、およびその他の特殊文字を処理し、中間ディレクトリは必ずしも 1 桁である必要はありません。

于 2013-04-11T15:34:49.240 に答える
2

いくつの異なる方法でそれを行いたいですか?

名前にスペース、改行、またはその他の問題のある文字が含まれておらず、中間ディレクトリが常に 1 桁である場合、および名前を変更するファイルのリストがfile.list1 行に 1 つの名前のファイルにある場合、多くの可能な方法の 1 つ名前の変更は次のとおりです。

sed 's%\(.*\)/\([0-9]\)/\(.*\)%mv \1/\2/\3 \1/\2_\3%' file.list | sh -x

必要なことが確実に実行されるまで、シェルを介してコマンドを実行することは避けてください。生成されたスクリプトが正しく表示されるまで見てください。

と呼ばれるコマンドもありますrename— 残念ながら、いくつかの実装があり、すべてが同等に強力というわけではありません。Perl に基づくもの (Perl 正規表現を使用して古い名前を新しい名前にマップする) を持っている場合は、次を使用できます。

rename 's%/(\d)/%/${1}_%' $(< file.list)
于 2013-04-11T15:19:24.390 に答える
1

これは、名前が常に同じ、つまり「file」の場合に機能する可能性があります。

for i in {1..3};
do
    mv $i/file ${i}_file
done

ある番号範囲に複数のディレクトリがある場合は、 に変更{1..3}{x..y}ます。

name の変数と見なされるため、${i}_file代わりに使用しますが、変数になりたいだけで、それに添付されたテキストが必要です。$i_file$i_filei_fileifile

于 2013-04-11T15:16:13.927 に答える
0

AskUbuntuのこのソリューションは私にとってはうまくいきました。

これを行うbashスクリプトは次のとおりです。

注: ファイル名にスペースが含まれている場合、このスクリプトは機能しません。

#! /ビン/バッシュ

# 現在のディレクトリ内のディレクトリのみを調べます。
for dir in $(find ./ -type d)
行う
    # 最初の 2 文字を削除します。
    # 最初は、$dir = "./directory_name".
    # このステップの後、$dir = "directory_name".
    dir="${dir:2}"

    # $dir が空の場合はスキップします。最初に $dir = "./" の場合にのみ発生します。
    もしも [ !$dir ]
    それから
        継続する
    フィ

    # ディレクトリ内のすべてのファイルを調べます。
    for file in $(ls -d $dir/*)
    行う
        # と置換する _
        # たとえば、$file = "dir/filename" の場合、$new_file = "dir_filename"
        # ここで $dir = dir
        new_file="${file/\//_}"

        # ファイルを移動します。
        mv $file $new_file
    終わり

    # ディレクトリを削除します。
    rm -rf $dir
終わり
  • スクリプトをコピーしてファイルに貼り付けます。
  • を使用して実行可能にします
chmod +x ファイル名
  • スクリプトを宛先ディレクトリに移動します。あなたの場合、これは内部にあるはずFolder/です。
  • を使用してスクリプトを実行します./file_name
于 2013-04-11T15:50:56.003 に答える