ディレクトリからファイルを読み取り、拡張子ごとにそのフォルダにクリーンアップします。

ディレクトリからファイルを読み取り、拡張子ごとにそのフォルダにクリーンアップします。

次の名前の複数のディレクトリを作成できるbash関数スクリプトを作成しようとしています。また、ファイルを拡張子ごとに適切なフォルダに整理しようとしました(例:.jpgは写真、.docは文書、.gifはメディアなど)。最初の部分は良いですが、ディレクトリが作成された後、2番目の部分は私を混乱させます。

    #!/bin/bash
    echo "Creating directory categories"

    function make_folder 
    {
        cd -; cd content; sudo mkdir ./$1
    }

    make_folder "documents"
    make_folder "other"
    make_folder "pictures"
    make_folder "media"

    echo "Directories have been made"; cd -
    exit

    ext="${filename##*.}" #set var ext to extension of files

    find ./random -name | #find and list all files in random folder
                          #pipe results of find into if statement

    if ext == ["jpg"; "jpeg"; "png"] #move ".jpg", etc to new destination
         then
           mv /path/to/source /path/to/destination

    elif ext == [".gif"; ".mov"] #move ".gif", etc to new destination 
         then
           mv /path/to/source /path/to/destination
    else                         #move other files into to new destination
           mv /path/to/source /path/to/destination
    fi

答え1

私の頭の上で、私は「ケース」ドアを使用します。

つまり

case "$FILE" in
    *.jpg|*.jpeg)
        mv "$FILE" to where you want it
        ;;
    *.gif|*.mov)
        mv "$FILE" to where you want it
        ;;
    *)
        echo "Unmanaged file type: $FILE, skipping"
        ;;
 esac

...しかし、ループコンテナで梱包する必要があり、確かにfindを使用したい場合は適しています。

 find <your stuff> | 
     while read FILE
     do
         ...case statement goes here
     done

ちょうど私の$ 0.02

乾杯! /ダニエル

答え2

あなたのmake_folder機能は不必要に複雑です。これらの現在のディレクトリの変更はあなたの人生をより複雑にするだけです。まず第一に、次の作業は必要ありませんsudo。ルートとしてディレクトリを作成するのはなぜですか?ただ電話してくださいmkdir

mkdir documents other pictures media

ディレクトリがすでに存在していてもスクリプトが機能するようにするには、次のようにしますmkdir -p

mkdir -p documents other pictures media

を使用するには、find名前を印刷して解析しないでください。find必要なコードを実行してみてください-exec。単純なプログラムを呼び出すだけでなく、シェルを呼び出すこともできます。の場合、<code>sh -c '<em>shell code</em>'シェルコードに続くパラメータはshシェルコードで使用できます$0変数の置換には常に二重引用符を使用してください。。シェルの断片から拡張によって区別する自然な方法は、次のものを使用することです。ケースファイル名に基づいて構成されます。私は使うパラメータ拡張${0##*/}ファイルのデフォルト名を取得するように構成されています(最後のスラッシュの前のすべてのエントリを削除します)。このテストは、[ -e "$destination_file" ]別のディレクトリから移動された同じ名前のファイルを上書きしないように、ターゲットファイルがすでに存在するかどうかをテストします。

find random -exec sh -c '
  case "$0" in
    *.gif|*.png|*.jpg) destination_directory=pictures;;
    *) destination_directory=other;;
  esac
  destination_file="$destination_directory/${0##*/}"
  if [ -e "$destination_file" ]; then mv "$0" "$destination_file"; fi
' {} \;

もう1つの方法はターゲットごとにファイルをコピーすることですが、ファイル数が多いと速度が遅くなる可能性がありますが、作成する方がはるかに簡単です。 Linuxでは、GNUユーティリティのおかげで、次のように簡単です。

find random \( -name '*.gif' -o -name '*.png' -o -name '*.jpg' \) -exec mv -n -t pictures {} +

他の宛先ディレクトリにも同様です。作業速度を上げるには、最後に一括呼び出しの+代わりに使用してください。;find -execmv

しかし、実際にbashやzshで実行されているタスクにはfind**ワイルドカード再帰的なディレクトリの検索に使用されます。

shopt -s globstar # necessary in bash to enable **
mv -n random/**/*.gif random/**/*.png random/**/*.jpg pictures/

すべてのファイルをターゲットディレクトリに直接配置するとします。ディレクトリ階層を再現したい場合は、話が異なり、他のツールが適しています。

関連情報