今後さらに役立つことを期待して、さらに2つの解決策を掲載します。これらは、職場のLinux管理者からのものです。何本のハンマーがこのネイルに使えるかを示しに行きます!
こんにちはデナム、
ここでは、いくつかの仮定を行う必要があります。たとえば、「XXX Season#」のディレクトリの部分は常に「外部」ディレクトリ(リーフノード)になるということです。
いずれにせよ、私は小さなスクリプトを書きます。次のようなものが機能するはずです(変数内の二重引用符に注意して、ディレクトリ内のすべてのスペースを確実にキャプチャしてください)。
find /media/Expansion2/Series/ -type d | while read olddir
do
newdir=`echo "${olddir}" | awk -F "/" '$NF ~ /Season/ { last=substr($NF,index($NF, "Season")); while (i<(NF-1)) { i++; printf("/%s", $i) }; printf("/%s\n", last) } $NF !~ /Season/ { print }'`
if [ "${olddir}" != "${newdir}" ]
then
mv "${olddir}" "${newdir}"
fi
done
もちろん、コマンド "mv" $ {olddir} "" $ {newdir} ""で実行する前に、 "echo" $ {olddir} "" $ {newdir} ""のようなものを入力して、あなたが期待する結果を得るか、あなたは別の頭痛に終わるかもしれません:-P
こんにちはデナム、
答えのほとんどはすでに問題になっています。とにかく、Seriesフォルダーから次のようなものを実行すると、問題なく動作します。
find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "`dirname "$dir"`/`basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"`"; done
説明:
•find -mindepth 2 -maxdepth 2 -type d(2レベル下のディレクトリをリスト)
•dirの読み取り中。(各ディレクトリでループ)
•mv -T "$ dir"(ソースディレクトリを次の場所に移動します...-シーズンフォルダーが一意でない場合、つまり「ビッグバン理論のシーズン」がない場合、エラーを取得するには-Tが必要です同じディレクトリにある22 "と"シーズン22 ")
•dirname" $ dir "は、dirが存在するパスを返します
•basename" $ dir "は、ディレクトリの名前を返します
•sed" s /。Season([0-9])$ / Season \ 1 / i "は、念のため、大文字と小文字を区別しない正規表現で魔法を完成させます。
私の小さなテストではうまくいきました(mvの前にエコーで最初に試してください):
someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/The Big Bang Theory Season 1
./The Big Bang Theory/The Big Bang Theory Season 1/file1.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file 3.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file2.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file
./The Big Bang Theory/The Big Bang Theory Season 1/3.avi
./Other Series
./Other Series/Season 2
./Other Series/Stre dsfdf sd dSeason 3
someuser@linux-box:/tmp/Series$ find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "dirname "$dir"
/basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"
"; done
mv: ./The Big Bang Theory/Season 2' and
./The Big Bang Theory/Season 2' are the same file
mv: ./Other Series/Season 2' and
./Other Series/Season 2' are the same file
someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/Season 1
./The Big Bang Theory/Season 1/file1.avi
./The Big Bang Theory/Season 1/file 3.avi
./The Big Bang Theory/Season 1/file2.avi
./The Big Bang Theory/Season 1/file
./The Big Bang Theory/Season 1/3.avi
./Other Series
./Other Series/Season 3
./Other Series/Season 2