
すべてのファイルを拡張子でフォルダに保存するスクリプトを実行してデスクトップを整理したいと思います。インターネット検索でいくつかのコードが見つかり、見つかったコードはファイル名でフォルダを作成し、そのフォルダにファイルを配置します。ファイル名ごとに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を返します(ディレクトリやデバイスなどのより特殊なタイプではありません)。それ以外の場合、文はループの残りの部分をスキップします。$file
continue
for
変数への割り当ては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 つ.
(ドット、別名ピリオド) なのでtxt
、todolist
と と同じ名前のファイルは省略されますoddball
。 (問題を混同するために、シェルワイルドカードは次の名前のファイルを除外します。スタート.
このオプションが設定されていない場合。 )(またはそれに対応する)名前がさらに制限されたファイルdotglob
*.*[!.]
*.*[^.]
含む最後のもの.
しかし、.
最後の文字がない場合したがって、oddball.
同様の名前のファイルを省略しますodd.ball.
。 AFAICT、これは名前が空でない拡張子を持つファイルをうまく表現したものです。
ext=${file##*.}
最後の点まですべて削除して拡張子を抽出します。上記の分析が正しい場合、値はnullではありません。引数がすでに存在し、ディレクトリの場合、この-p
オプションは失敗しません。mkdir
、、などの一般的なファイル、および(などの名前のファイルがある場合)、txt
またはpdf
他の極端な場合(たとえば、現在のディレクトリに書き込み権限がないか残りのスペースがない場合)、ファイルにスキーム)、jpg
shopping_list.txt
ext=txt
mkdir
〜する失敗し、自己診断メッセージをエクスポートします。そして(@Wildcardが提案したように)以下&&
は試みられません。mv
コマンド/
の最後には、名前付き一般ファイルmv
の破損を防ぐセーフティネットがありますtxt
。pdf
jpg
mv -- "$file" "$ext"/
ターゲット名が通常のファイル(またはディレクトリ以外のファイル形式)で存在する場合にのみ失敗します。