複数のファイルを同じベース名を持つディレクトリに移動する

複数のファイルを同じベース名を持つディレクトリに移動する

この例に示すように、基本名が同じで拡張子が異なり、複数のディレクトリを持つ複数のファイルがあります。

FileA.txt
FileA.html
FileA.directory/

FileB.txt
FileB.html
FileB.directory/

FileC.txt
FileC.html
FileC.directory/

基本名に基づいてすべてのファイルをそのディレクトリに移動できるforループを作成したいと思います。結果は次のとおりです。

FileA.directory/FileA.txt
FileA.directory/FileA.html

FileB.directory/FileB.txt
FileB.directory/FileB.html

FileC.directory/FileC.txt
FileC.directory/FileC.html

このページでは、この例のように、私の問題に似たいくつかの提案を見つけようとしました。しかし、まったく同様の質問が見つかりません。

for dir in .*/
do
    for f in "$dir"*
    do
        base=${f#$dir}
        mv "$base.*" "$dir"
    done
done

しかし、私はそれを動作させることはできません。

ベストアンサー1

ファイルとディレクトリの名前は、ドットが続く共通のグループ化プレフィックスを共有するため、同じ命名規則に従い、ファイルまたはディレクトリのファイル名サフィックスがわからないとします。

topdir=.

for dirname in "$topdir"/*/; do
    prefix=$( basename "$dirname" )  # $topdir/FileC.directory/ --> FileC.directory
    prefix=${prefix%%.*}             # FileC.directory          --> FileC

    for filename in "$topdir/$prefix".*; do
        if [ ! -d "$filename" ]; then
            mv -i "$filename" "$dirname"
        fi
    done
done

外部ループはディレクトリ内のすべてのディレクトリを繰り返します$topdir(ここでは.現在のディレクトリに設定されています)。これは$prefixディレクトリ名のデフォルト名になり、最初のドットの後のビットは削除されます。

プレフィックスが計算されると、$topdir同じプレフィックスを共有する同じディレクトリのディレクトリ以外のファイル(ファイル)がそのディレクトリに移動されます。

おすすめ記事