私はファイルを整理するのに役立つスクリプトを書いています。デフォルトでは、スクリプトは拡張子に従ってファイルを構成したいと思います。現在のソリューションは、特定のディレクトリのすべてを調べます。名前にドットがあるフォルダが移動されるため問題になります。
if statement
ディレクトリが物理ディレクトリであることを確認するために使用できる方法があるかどうか疑問に思います。実際にディレクトリの場合、スクリプトはディレクトリを移動しないでください。
コード部分です。私はfor loop
ファイルを繰り返すためにaを使用しています。これはWindowsにあった以前のバッチスクリプトに大まかに基づいているため、これが最善のアプローチではない可能性があります。より良い解決策があれば教えてください。
#!/bin/bash
for i in *.*; do
filename=$(basename -- "$i")
extension="${filename##*.}"
extension="$extension"files
mkdir -p "$extension"
mv "$i" "$extension"
done
ベストアンサー1
個人的には、forディレクトリ/ファイルを使用してそれぞれファイル形式を指定できるfind
ため、aとループを使用します。while
-type d/f
実行するディレクトリの「行」として:
find . -maxdepth 1 -type f -name "*.*" | while IFS="" read -r line; do filename=$(basename -- "$line"); extension="${filename##.}.files"; mkdir -p "$extension"; mv "$line" "$extension"; done
またはスクリプトから:
#!/bin/bash
find . -maxdepth 1 -type f -name "*.*" |
while IFS="" read -r line; do
filename=$(basename -- "$line")
extension="${filename##.}.files"
mkdir -p "$extension"
mv "$line" "$extension"
done
説明する
find .
- 現在のディレクトリでファイルとディレクトリを探す
-maxdepth 1
- 現在のディレクトリのみを確認します。 (2は次のレベルディレクトリも確認します。)
-type f
- ファイルのみ一致
-name *.*
- 名前に「.」を含むすべてのファイル
.files
私もそれがあなたが望むものだと思うので、拡張を変数宣言に変更しました。現在スクリプトにあるようにtmp.txt
ディレクトリにあると言いたい場合は、次のように「.」を削除します。tmp.txtfiles
extension="${filename##.}files"
編集する:
したがって、@Kusalanandaが指摘したように、aを繰り返すのはfind
おそらく悪い考えです。それにもかかわらず、find
この機能を引き続き使用できます。一時ファイルを使用して繰り返します。
#!/bin/bash
find . -maxdepth 1 -type f -name "*.*" > myTemporaryFile
IFS=$'\n' # in case any filenames have spaces in them
for line in $(cat myTemporaryFile); do
filename=$(basename -- "$line")
extension="${filename##.}.files"
mkdir -p "$extension"
mv "$line" "$extension"
done
rm myTemporaryFile