拡張子に基づいてデスクトップをフォルダ/ディレクトリとして構成するスクリプト

拡張子に基づいてデスクトップをフォルダ/ディレクトリとして構成するスクリプト

すべてのファイルを拡張子でフォルダに保存するスクリプトを実行してデスクトップを整理したいと思います。インターネット検索でいくつかのコードが見つかり、見つかったコードはファイル名でフォルダを作成し、そのフォルダにファイルを配置します。ファイル名ごとに1つのフォルダが必要ない...すべての.txtを含む1つのフォルダ、.jpgを含む別のフォルダ...などが必要です。私はOS Xを使用しています。

これが私が持っているものです...どんな方向でもいいようです。ありがとうございます!

for file in *.txt
    do
        dir="${file%.txt}"
        mkdir -- "$dir"
        mv -- "$file" "$dir"
done

答え1

必要なものがファイルタイプ固有のディレクトリであれば、次のようなものが欲しいでしょう。

mkdir txt || { echo "Can't mkdir txt" ; exit 1 ; }
for file in *.txt ; do
    mv -- "$file" txt/
done

上記のトラブルシューティングに注意してくださいmkdir。コードにすでに存在する場合文書変数に含まれる名前を使用すると、$dirコマンドmkdir --"$dir"が実行されます。何も言わずに失敗すると、mvコマンドが実行されます。書くそのファイル。


ランダムに名前付きの複数のファイル(現在のディレクトリにある3文字拡張子を持つすべてのファイル)を処理し、ファイル拡張子としてディレクトリに配置するには、次のコード(テストされていません)を使用できます。

for file in *.??? ; do
    [ -f "$file" ] || continue
    dir="$(echo "$file" | rev | cut -c-3 | rev)"
    mkdir -p "$dir" || { echo "Couldn't mkdir -p $dir; exiting" ; exit 1 ; }
    mv -- "$file" "$dir"
done

説明する:

このパターンは*.???すべてのファイルと一致します。とディレクトリ現在のディレクトリでは、その名前は.ピリオド()で終わり、その後に3文字が続きます。

[ -f "$file" ]テストは通常​​のファイルの場合にのみtrueを返します(ディレクトリやデバイスなどのより特殊なタイプではありません)。それ以外の場合、文はループの残りの部分をスキップします。$filecontinuefor

変数への割り当てはdir素晴らしく見えますが、実際には変数の内容を取得して$file反転し(逆文字列の)最初の3文字を抽出して再度反転し、結果をの値として割り当てます$dir。つまり、ファイル名の最後の3文字です。

その後、mkdir -pディレクトリがすでに存在する場合は成功が返され、ディレクトリが存在しない場合は作成されます(成功が返されます)。成功を返さないと、ファイルをそこに移動したくありません!したがって、エラー処理。

その後、mvコマンドは通常どおりです。


エラー処理に関する注意:

次の構造を見ることができます。

mkdir -p "$dir" || echo "Failed, exiting" && exit 1

コマンドは次のexit場合にのみ実行されるため、完全ではありません。echo成功コマンドが失敗した後mkdir。代わりに、あなたが望むのはexit実行コマンドを持つことですにもかかわらずコマンドがecho成功したかどうか(mkdir失敗したと仮定)ので、上記の中括弧を使用しました。

答え2

必要なものがファイルタイプ固有のディレクトリであれば、次のようなものが欲しいでしょう。

for file in *.*[!.]
do
    ext=${file##*.}
    mkdir -p -- "$ext"  &&  mv -- "$file" "$ext"/
done

他のオペレーティングシステムとは異なり、Unixでは*.*すべてのファイルを参照するのではなく、名前ですべてのファイルを参照します。含む少なくとも 1 つ.(ドット、別名ピリオド) なのでtxttodolistと と同じ名前のファイルは省略されますoddball。 (問題を混同するために、シェルワイルドカードは次の名前のファイルを除外します。スタート.このオプションが設定されていない場合。 )(またはそれに対応する)名前がさらに制限されたファイルdotglob*.*[!.]*.*[^.]含む最後のもの. しかし、.最後の文字がない場合したがって、oddball.同様の名前のファイルを省略しますodd.ball.。 AFAICT、これは名前が空でない拡張子を持つファイルをうまく表現したものです。

ext=${file##*.}最後の点まですべて削除して拡張子を抽出します。上記の分析が正しい場合、値はnullではありません。引数がすでに存在し、ディレクトリの場合、この-pオプションは失敗しません。mkdir、、などの一般的なファイル、および(などの名前のファイルがある場合)、txtまたはpdf他の極端な場合(たとえば、現在のディレクトリに書き込み権限がないか残りのスペースがない場合)、ファイルにスキーム)、jpgshopping_list.txtext=txtmkdir 〜する失敗し、自己診断メッセージをエクスポートします。そして(@Wildcardが提案したように)以下&&は試みられません。mv

コマンド/の最後には、名前付き一般ファイルmvの破損を防ぐセーフティネットがありますtxtpdfjpg

    mv -- "$file" "$ext"/

ターゲット名が通常のファイル(またはディレクトリ以外のファイル形式)で存在する場合にのみ失敗します。

関連情報