重複ファイルを含むフォルダ内の一意のファイルを移動する

重複ファイルを含むフォルダ内の一意のファイルを移動する

つまり、次の形式のフォルダに重複ファイルがあります。

file.ext
file(1).ext
file(2).ext
file(3).ext
otherfile.ext
otherfile(1).ext
otherfile(2).ext
...

別のフォルダfile.extに移動したいです。otherfile.extでできますかbash

これが役に立つと思いましたかawk

答え1

存在するbash:

shopt -s extglob # activates extended pattern matching features
mv !(*\(+([0-9])\)).ext /path/to/target/

正規表現は、1つ以上の数字(n).extで終わらないすべてのファイルと一致します。n+([0-9])

以下で確認できますecho

echo !(*\(+([0-9])\)).ext 

印刷:

file.ext otherfile.ext

答え2

時々違うよね名前に含まれるファイルを(無視する必要があると仮定できる場合は、次のようにします。

shopt -s extglob ## turns on fancy glob patterns
mv !(*\(*) /path/to/target

次の名前を含む別の名前を使用できる場合、または(その重複ファイルを移動する必要がある場合は、次の操作を実行できます。

for f in *\(*; do 
    ## Does this file have an original?
    [[ -e "${f%%(*}.${f##*.}" ]] && 
        ## Move the original
        mv "${f%%(*}.${f##*.}" /path/to/target; 
done

答え3

次のようにしてみてください。

$ ls  *ext | grep -P '[^)]\.ext' | xargs -iXXxxFILEXXxx mv XXxxFILEXXxx target/

grep名前に括弧を含むファイルはフィルタリングされ、xargs結果に対してコマンドが実行されます。ファイル名を引数として使用するmv見苦しいタグ。XXxxFILEXXxxmv

関連情報