正規表現に一致するサブディレクトリの名前を再帰的に変更する


10

と呼ばれるフォルダを持つメディアサーバーがありますSeries。(/media/Expansion2/Series/

その中で、私は(驚き!)TVシリーズを持っています。これらは単なるショー名です。たとえば、/media/Expansion2/Series/The Big Bang Theory/

各ショーのフォルダー内(および問題がある場所です)にシーズンフォルダーがあります。私は現在、次の2つの規則が混在しています(おそらくいくつかの規則に加えて):

  1. /media/Expansion2/Series/The Big Bang Theory/The Big Bang Theory Season 1
  2. /media/Expansion2/Series/The Big Bang Theory/Season 2

最後に、すべてのフォルダの名前を単にに変更しますSeason #

正規表現として、私はおそらく次のようなことを言うでしょう s/.*(Season \d)/$1

フォルダーにのみ適用され、ファイルには適用されません。これは約50以上のshowサブフォルダ用であることにも言及する必要があるため、/media/Expansion2/Series/レベルから開始して各シリーズを調べる必要があります:)

回答:


11

Debianおよび派生物(Ubuntuを含む):

find /media/Expansion2/Series/ -type d -exec rename -n 's/.*(Season \d)/$1/' {} ";"

renameコマンドは、Perlのパッケージの一部です。他のディストリビューションでは提供されていません。代わりに、renameここでは役に立たない標準のLinux コマンドが提供されています。

rename -n(実際にはそうではないが)実行したいことが表示され、それで問題がない場合は、-nを省略して実行します。


言うまでもありませんが、この方法は過去数日間、フォルダだけでなくファイルにも特に役立つことがわかりました。ありがとう。
Denham Coote 2012

私が覚えている限り、このツールはrenameDebianでのみ呼び出されます。Ubuntu(および一部のフレーバー)では、前述の標準renameコマンドとの名前の衝突を回避するために、(必ずしもではないが)の下に見つかることがありprenameます。ここLubuntuに、ツール自体が呼び出されprename、それは次のように呼ばれてもよいrenameシンボリックリンクチェーンに起因する/usr/bin/rename -> /etc/alternatives/rename -> /usr/bin/file-renamefile-renameわずかに修正されたバージョンですprename
構文エラー

驚くばかり!これにより、複数のディレクトリにある複数のファイルに対してそれを実行できました
eusoubrasileiro 2016年

2

次のスニペットはSeason [0-9]、の下にあるすべてのshowディレクトリで最後に発生する前に発生するすべてのものを削除し/media/Expansion2/Seriesます。正規表現は必要ありません。グロブだけです。

cd /media/Expansion2/Series
for show in ./*/; do
    (
        cd "$show" || { echo "cd failed.  Skipping $show"; exit 1; }
        for season in ./*Season\ [[:digit:]]*/; do
                season_prefix=${season%Season [[:digit:]]*}
                mv "$season" ./"${season#$season_prefix}"
        done
    )
done

2

安全にプレイし、名前some show/some show stuffsome show/stuff次のように変更したい場合:

for d in */; do
  for f in "$d${d%/} *"; do
    mv "$f" "${d}${f%$d${d%/} }"
  done
done

以前にすべてを削除したい場合Season

for x in */*Season*; do
  mv "$x" "${x%/*}/${x##*Season}Season"
done

${var#PATTERN}の最初でPATTERNを取り除き$var、結果を返します。${var%PATTERN}最後に同じことを行います。${var#PATTERN}そして${var%PATTERN}、それぞれ最短一致するプレフィックスとサフィックスを除去します。最長一致${var##PATTERN}${var%%PATTERN}削除します。


0

今後さらに役立つことを期待して、さらに2つの解決策を掲載します。これらは、職場のLinux管理者からのものです。何本のハンマーがこのネイルに使えるかを示しに行きます!

解決策1:

こんにちはデナム、

ここでは、いくつかの仮定を行う必要があります。たとえば、「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


解決策2:

こんにちはデナム、

答えのほとんどはすでに問題になっています。とにかく、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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.