実行時にディレクトリを調べ、すべてのファイルを検索し、自動的にファイル名パターンを検索し、以下に説明する追加のロジックに従って移動するスクリプトを作成しています。
私のフォルダに次のファイルがあるとしましょう。
- AAA.txt
- 一時-203981.log
- 一時-098723.log
- 一時-123197.log
- 一時-734692.log
- test1.sh
- test2.sh
- test3.sh
スクリプトは自動的にディレクトリを検索し、名前に一致するプレフィックスを持つ4つのファイル(temp-XXX.log)と3つのファイル(testXXX.sh)を見つける必要があります。その後、ファイル数を見つけたら、それを定義された制限(例:3)と比較する必要があります。
指定された名前と一致するファイルの数が制限より大きい場合、見つかったファイルは一致するファイル名の部分として名前付きフォルダに移動する必要があります。
したがって、上記の親フォルダは次のようになります。
- AAA.txt
- temp.log(temp-734692.log、temp-123197.log、temp-098723.log、temp-203981.logを含むフォルダ)
- test.sh(test1.sh、test2.sh、test3.sh を含むフォルダーになります)
これが意味があることを願っています。
PS私はこのスクリプトでASHを使用しているので、素晴らしいbash機能なしで実行できるはずです。そうでなければ、これは簡単です。
ありがとうございます!
編集:始めるとすぐに明確さが変わりました。また、すべてのファイル名に事前定義された区切り記号(「&」など)を指定すると、簡単になります。スクリプトでは、区切り文字の前にあるファイル名に基づいて可変フォルダ名を生成する必要がありますが、これは作業がより明確で簡単になると思います。
ベストアンサー1
動作していることを確認し、どのように動作するかを説明します。でテストしましたdash
。
メモ:ファイル名にはスペースや改行を含めないでください。
#!/bin/dash
limit=1
printf "%s\n" * |
sed 's/[-0-9]*\..*$//' |
uniq -c |
awk -v lim=${limit} '$1 >= lim {print $2}' |
sort -r |
while read -r i; do
for j in "${i}"*; do
[ -f "$j" ] || continue
dir=${i}.${j#*.}
[ -d "$dir" ] || mkdir "$dir"
mv -v "$j" "$dir"
done
done
ここに問題があります。たとえば、ファイル名が将来のディレクトリ名と同じ場合ですaaa.txt
。このaaa.txt
場合、ファイル名に余分な文字がないため、何も削除されないため、新しいディレクトリ名が同じであるため、エラーが発生します。
mkdir: cannot create directory ‘aaa.txt’: File exists
mv: 'aaa.txt' and 'aaa.txt' are the same file
この問題に対する解決策の1つは、想定されているディレクトリ名がファイル名と同じであることを確認してから、将来のディレクトリ名にいくつかの番号を追加することaaa1.txt
です。
デモ
スクリプトが実行される前に。
$ tree
.
├── aaa.txt
├── temp-098723.log
├── temp-123197.log
├── temp-203981.log
├── temp-734692.log
├── temp-new-file123.log
├── temp-new-file-2323-12.log
├── temp-new-file-342.log
├── test1.sh
├── test2.sh
└── test3.sh
0 directories, 11 files
スクリプトが実行された後: script.sh
$ tree
.
├── aaa.txt
├── temp.log
│ ├── temp-098723.log
│ ├── temp-123197.log
│ ├── temp-203981.log
│ └── temp-734692.log
├── temp-new-file.log
│ ├── temp-new-file123.log
│ ├── temp-new-file-2323-12.log
│ └── temp-new-file-342.log
└── test.sh
├── test1.sh
├── test2.sh
└── test3.sh
3 directories, 11 files