この例に示すように、基本名が同じで拡張子が異なり、複数のディレクトリを持つ複数のファイルがあります。
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
同じプレフィックスを共有する同じディレクトリのディレクトリ以外のファイル(ファイル)がそのディレクトリに移動されます。
答え2
.html
すべてのファイルにファイル名のサフィックスがあるか、すべてのディレクトリ.txt
にサフィックスがあることがわかっていると仮定すると、.directory
次のようになります。
for i in *.txt *.html
do
mv "$i" "${i%%.*}.directory/$i"
done
ファイルがある同じディレクトリでこのコマンドを実行します。ファイル名から末尾の.txtと.htmlを削除してから、ファイルをターゲットディレクトリに移動します。
答え3
dirs=$(ls | grep ".d")
for d in $dirs
do
filename=$(echo $d | awk -F"." '{print $1}')
ls | grep -P "$filename.(?!(d))" | xargs -I{} mv '{}' '$d'
done
とても冗談かもしれませんが、うまくいきます