0

トレントの命名規則に従っているメディア ファイルの大規模なリポジトリがありますが、読むのが不快です。ある時点で、上記のファイルを含むフォルダーに適切な名前を付けていましたが、bash スクリプトを使用してすべての .avi、.mkv などのファイルをメインのメディア ディレクトリにダンプしたくありませんでした。

概要: 現在のディレクトリ ツリー:

Proper Movie Title/
->Proper.Movie.Title.2013.avi
->Proper.Movie.Title.2013.srt
Title 2/
->Title2[proper].mkv
Movie- Epilogue/
->MOVIE EPILOGUE .AVI
Media Movie/
->MEDIAMOVIE.CD1.mkv
->MEDIAMOVIE.CD2.mkv

. . .

必要なディレクトリ ツリー:

Proper Movie Title/
->Proper Movie Title.avi
->Proper Movie Title.srt
Title 2.mkv
Movie- Epilogue.avi
Media Movie/
->Media Movie.cd1.mkv
->Media Movie.cd2.mkv

これは理想的ですが、私の主な願いは、そのファイルの名前を変更して親ディレクトリに移動する、1 つのムービー ファイルしかないディレクトリです。

私の現在のアプローチは、.sh ファイルで double for ループを使用することですが、現在、新しい bash の知識を頭に入れておくのに苦労しています。

助けていただければ幸いです。

私の現在のコード(内部のムービーファイルにアクセスするためだけに):

#!/bin/bash
FILES=./*
for f in $FILES
do
        if [[ -d $f ]]; then
                INFILES=$f/*
                for file in $INFILES
                do
                        echo "Processing >$file< folder..."
                done
        #cat $f
        fi
done
4

1 に答える 1

4

ここに簡単なものがあります:

find * -type f -maxdepth 1 | while read file
do
    dirname="$(dirname "$file")"
    new_name="${dirname##*/}"
    file_ext=${file##*.}
    if [ -n "$file_ext" -a  -n "$dirname" -a -n "$new_name" ]
    then
        echo "mv '$file' '$dirname/$new_name.$file_ext'"
    fi
done

は、現在のディレクトリ内のすべてのアイテムfind *に対して検索を実行するように指示します。は、ファイルにのみ関心があることを示し、検索の深さを直接のディレクトリに制限します。-type f-maxdepth 1

  • パターンマッチ${file##*.}を使用しています。は、基本的にファイル拡張子にすべてを引っ張っている最大の左側の一致を示します。##*.
  • file_dir="$(dirname "$file")"ディレクトリ名を取得します。
  • どこでも引用符に注意してください!空白には注意が必要です。

ちなみに、私echoは実際の動きをする代わりに。出力をファイルにパイプし、そのファイルを調べて問題がないことを確認してから、そのファイルをシェル スクリプトとして実行できます。

于 2013-06-13T05:02:44.437 に答える