フォルダ内の特定のパターンと一致する(または一致しない)すべてのファイルを見つける方法は?

フォルダ内の特定のパターンと一致する(または一致しない)すべてのファイルを見つける方法は?

フォルダとサブフォルダで3桁の数字で終わるすべてのファイルを見つけて、ディレクトリ構造を維持しながら新しい場所に移動するにはどうすればよいですか?

または、名前が3桁の数字で終わらないすべてのファイルをどのように見つけることができますか?

答え1

@don_crisstiがリンクした答えに基づいたよりクリーンなソリューションです。 (Rsyncフィルタ:1つのパターンのみをコピー)

rsync -av --remove-source-files --include='*[0-9][0-9][0-9]' --include='*/' --exclude '*' /tmp/oldstruct/ /tmp/newstruct/

そして否定:

rsync -av --remove-source-files --exclude='*[0-9][0-9][0-9]' /tmp/oldstruct /tmp/newstruct/

元の答え:

これはトリックを行う必要があります。入力した構造体で3桁で終わるすべてのファイルを見つけて、ターゲットcdフォルダを作成して/tmp/newstructファイルを移動します。

cd /tmp/oldstruct
find ./ -type f -regextype posix-basic -regex '.*[0-9]\\{3\\}' | 
  while read i; do 
    dest=/tmp/newstruct/$(dirname $i)
    mkdir -vp $dest
    mv -v $i $dest
  done

実際に実行する前にとを追加して、期待どおりに機能していることを確認することをお勧めしますmkdirmvecho

3桁の数字を否定するには、doと入力します! -regex


これはrsyncに依存するより簡単な方法です。しかし、rsync見つかったすべてのファイルを呼び出すので、確かに効率的ではありません。

find ./ -type f -regextype posix-basic -regex '.*[0-9]\{3\}' --exec rsync -av --remove-source-files --relative {} /tmp/newstruct

答え2

Bashを使用してこれを行うことができます。

## Make ** match all files and 0 or more dirs and subdirs
shopt globstar
## Iterate over all files and directories
for f in **; do 
    ## Get the name of the parent directory of the 
    ## current file/directory
    dir=$(dirname "$f"); 
    ## If this file/dir ends with 3 digits and is a file
    if [[ $f =~ [0-9]{3} ]] && [ -f "$f" ]; then 
        ## Create the target directory
        mkdir -p targetdir1/"$dir"
        ## Move the file
        mv "$f" targetdir1/"$f" 
    else 
        ## If this is a file but doesn't end with 3 digits
        [ -f "$f" ] && 
        ## Make the target dir
        mkdir -p targetdir2/"$dir" &&
        ## Move the file
        mv "$f" targetdir2/"$f" 
    fi 
done

関連情報