ファイル名に基づいてディレクトリ内のファイルをソートする

ファイル名に基づいてディレクトリ内のファイルをソートする

私は科学アーカイブディレクトリで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/filesmakemkdirと組み込みがあります。これは、との呼び出しが同じであることを意味します)。mvmkdirmv

おすすめ記事