私は科学アーカイブディレクトリで35,000以上の陽性診断を検索しました。 (幸いなことに、ファイル名の形式はかなり均一です。{year}-{place}-{film-#}-{photo-#} OR {year}-{year}-{place}-{film-#}-{photo-#}
)
ORに名前を付けてregex
ディレクトリを作成し、その写真をこのディレクトリに移動したいと思います。awk
{year}-{place}
{year}-{year}-{place}
この記事は非常に似た問題に対処していることを知っていますが、「古い」ことはできません。
いくつかの問題がありますが、最大の問題は正規表現が機能することができないことです(正規表現はうまく機能し、特にregex101.com
問題はありません)。動作させることができますが、他の正規表現グループはサポートされていないようです。(
|
)
awk
どんな助けでも大変ありがとうございます =)
私の正規表現の問題を示すうまくいかない例:
#!/bin/bash
regex='\([0-9]*-[0-9]*\|[0-9]*\)-[a-zA-Z]*'
liste='1975-Bali.jpg'
echo $liste
[[$liste=~$regex]]
echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"
以下を提供します。
1975-Bali.jpg
./ALT_ordner_erstellen.sh: line 8: [[1975-Bali.jpg=~\([0-9]*-[0-9]*\|[0-9]*\)-[a-zA-Z]*]]: command not found
編集する:
Paul_Pedantがコメントしたように:疑似コードで表現されたスクリプト構造についての私の考えは次のとおりです。
loop begin
# via awk or sed?
for every filename
mkdir based on {year}-{place} or {year}-{year}-place
mv corresponding files to directory
loop end
mkdir は、既存のディレクトリを作成しないことを選択できます。そうですか?そうでなければ、多くの写真を1つのディレクトリに配置する必要があり、再作成するたびに移動された写真が失われるため、すべてをループで実行するという上記のアイデアはあまり賢明ではありません。そうですか?
ファイル名の例:
1980-1981-Bali-055-21a.jpg
1980-1981-Bali-055-21.jpg
1980-1981-Bali-055a-21.jpg
1980-Bali-055-21.jpg
1980-Bali-055a-21.jpg
そして、「年-年-場所-映画-写真」と「年-場所-映画-写真」がはっきりあるかもしれませんので、最初からファイル名を検索しない気もしましたが、最後から次のスニペットをご覧ください。 :
echo "1980-Bali-055a-028.jpg" | sed -e "s/-[0-9a-zA-Z]*-[0-9]*.jpg$//"
しかし、film-photo.jpgが常にファイル名の終わり(!)であることを100%確信することはできず、ファイル名も多く、正をスキャンしていません。
ご意見ありがとうございます!
答え1
そしてzsh
:
zmodload zsh/files
autoload -Uz zmv
mkmv() { mkdir -p -- "$2:h" && mv -- "$@"; }
zmv -n -P mkmv '(<1600-2020>(-<1600-2020>|)-[^0-9-][^-]#)*(#q.)' '$1/$f'
目的の効果が満足のいくものを削除します-n
(テスト実行)。
(名前を変更できる何千ものファイルがあるため、スピードを上げるためにzmodload zsh/files
makemkdir
と組み込みがあります。これは、との呼び出しが同じであることを意味します)。mv
mkdir
mv