2016-07-03 15 views
4

の名前を変更私は合計noobのですが、私は次の操作を行うために、このスクリプトを考え出し:bashスクリプトの最適化ファイルが

私は内部のRARファイルを使用して、未知のフォルダ名とサブフォルダがある中で、「のunrar」というフォルダがあります。 私はunknownsubfolderを入力し、rarファイルを見つけてunknownsubfolderでunrarします。 その後、私は新しいファイルを見つけて、unknownsubfoldernameで名前を変更します。今私はファイルをつかんで./unrarに移動します。

#!/bin/bash 

cd /home/user/unrar/ 

for dir in /home/user/unrar/*; 
    do (cd "$dir" && find -name "*.rar" -execdir unrar e -r '{}' \;); done 

echo "$(tput setaf 2)-> unrar done!$(tput sgr0)" 

for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.mkv" -exec mv '{}' "${PWD##*\/}.mkv" \;);  done 
for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.mp4" -exec mv '{}' "${PWD##*\/}.mp4" \;);  done 
for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.avi" -exec mv '{}' "${PWD##*\/}.avi" \;); done 

cd /home/user/unrar 
find -name "*.mkv" -exec mv '{}' /home/user/unrar \; 
find -name "*.mp4" -exec mv '{}' /home/user/unrar \; 
find -name "*.avi" -exec mv '{}' /home/user/unrar \; 

これは、ほとんどのファイルで正常に動作しますが、いくつかのケースではそれは私が* DIR内の.rarを見つけたいと、それをのunrarない

ありません。新しいファイル(.mkv | .avi | .mp4)はDIR(.mkv | .avi | .mp4)に名前を変更し、./unrarに移動する必要があります。

これは私のファイル構造です。

./unrar/ 
    - unknownsubfolder/ 
     -file.rar 
     -file.r00 
     -.... 
    - unknownsubfolder1/ 
     - s01/ 
      - file.rar 
      - file.r00 
      - .... 
     - s02/ 
      - file.rar 
      - file.r00 
      - .... 
     - .... 

case1の場合、 "/unknownsubfolder/file.rar"をunrarして "x.mkv"を取得します。ファイルは "unknwonsubfolder.mkv" に "x.mkv" から名前を変更し、(* .AVI + * .MP4と同じ) "./unrar/unknownsubfolder.mkv" == PERFEKT

ケース2の場合に移動され、私のスクリプトのunknownsubfolder/s01/file.rarはうまくいきますが、unknwonsubfolder1.mkvにinstedされたs01.mkvに名前は変更されません。 (もっとS02、S03、S04 ...等がある場合)私は常に./unrarで1つのunknownsubfolder.mkvファイルで終わる)==間違った出力

ので、私は3つの質問

を持っていると思いますファイルの名前を変更するための正しいDIRnameを取得するにはどうすればよいですか?または、私はunknownsubfolder/s01 ...と入力しますか?

単語を検索対象から除外する方法はありますか? 「unknownsubfolder」には「sample(.mkv | .avi | .mp4)」という別のフォルダ+ファイルが含まれていることがあります。元のファイルがサンプルファイルで上書きされないように、除外したいと思います。時々起こる

コードの一部を組み合わせて、さらに短くすることができると確信しています。誰かがどのように説明できましたか?では、mkv、avi、mp4をどのように1行にまとめるのですか?

に関して、ウォンバット

(EDIT:よりよい理解のために)

+0

問題がある場合、1つのrarファイルの代わりにunknownsubfolderの中に30個のサブフォルダがあることを正しく理解していますか?あなたが言いましたように、それは 'subfolder1-30'という名前の1つのフォルダだと思うかもしれません。これらのサブフォルダにはまだ1つのrarファイルしか含まれていませんか? – nautical

+0

右のunknownsubfolderには、最大30個のサブフォルダが含まれ、それぞれに圧縮されたビデオがrarに格納されます。 – wombat

答えて

2

UPDATE:

Iはunrarで動作するように溶液を調整しました。以前はunrarがインストールされていなかったので、gunzipを使用してソリューションを構築し、それを単にunrarに置き換えました。この方法の問題点は、デフォルトではunrarが現在の作業ディレクトリに抽出されるということでした。もう1つの違いは、抽出されたファイルの名前はアーカイブの名前とは完全に異なる可能性があることです。これは単なる拡張機能の問題ではありません。元のアーカイブも抽出後に削除されません。ここで

は、特に前述の挙動に関してunrarで動作するように仕立てソリューションです:

#!/bin/bash 

path="$1" 
omit="$2" 

while read f;do 
     unrar e -r "${f}" "${f%/*}" > /dev/null 
done < <(find "${path}" -type d -name "${omit}" -prune -o -type f -print) 

while read f;do 
     new="${f%/*}" 
     new="${new##*/}" 
     mv "${f}" "${path}/${new}" 
done < <(find "${path}" -type d -name "${omit}" -prune -o -type f -a \! -name '*.rar' -print) 

あなたは、例えば、スクリプトを保存することができます、rename-scriptとして(それを実行可能にすることを忘れないでください)、その後、スクリプト内で何cdがないこと、

./rename-script /path/to/unrar omitfolder 

お知らせのようにそれを呼び出します。少なくともunrarフォルダの場所を最初のパラメータとして指定する必要があります。そうしないと、エラーが発生します。 OPの場合、これは/home/user/unrarになります。 omitfolderではなく、のパスです。省略したいフォルダの名前にすぎません。したがって、OPの場合、これはsampleになります。コメントでOPによって要求されたよう

./rename-script /home/user/unrar sample 

、あなたが理解するためにbash read-builtinprocess substitutionについて読むことができますどのように動作し、-loop whileそれが変数ffindによって返されたファイル名を割り当てる方法。

+0

お返事ありがとうございます。今、私は何かを打ち負かすことはありませんが、私はそれを理解しようとします、何が何をし、より良いフィードバックで戻ってくるのですか? – wombat

+0

私はそのスクリプトを実行すると、 "<<"予期しない単語で構文エラーが表示されます。私は、すべての行がスクリプト内で何をしているのか把握することができますが、実際には "read f"とは何か、そして "$ {f}"は意味しません。私はそれがunrarにwnatファイルだと思いますが、fはそれがunrarするファイルであることをどのように知っていますか?あなたはそれを説明できますか? – wombat

+0

@wombat「unrar」で動作するようにソリューションを更新しました。私は以前に 'gunzip'を使っていました。単に' unrar'と置き換えました。しかし、あなたのエラーはスクリプトを適切に呼び出さないことに起因します。少なくとも、unrar-folderの場所は最初のパラメータとして指定する必要があります。 unrarフォルダが常に同じ場所にあり、omitフォルダの名前が常に同じ場合、 'path ="/home/user/unrar "と' omit = sample'を変更することで、両方をスクリプトにハードコードすることができます。その後、パラメータなしで呼び出すことができます。 – nautical

関連する問題