コマンドラインmv除外リスト

コマンドラインmv除外リスト

すべてのファイルを指定する方法やファイル操作方法はmvありますか?cpいいえ影響を受けたいですか?

たとえば、ファイルを含むフォルダfile1があり、どこかに移動したいとします。移動したいファイルの名前を明示的に指定する代わりに()ファイル名を指定したいと思います。file2file3file1file2mv file1 file2 /path/to/destinationいいえフォルダ(mv --some-switch file3 /path/to/destination)の他のすべての項目を移動して移動します。

ベストアンサー1

  • 一部のシェルでは、拡張ワイルドカードパターンを使用して、特定のパターンと一致するファイルを除いてディレクトリ内のすべてのファイルを一致させることができます。たとえば、ksh、bash、またはzshでは、次のコマンドを使用します。

    shopt -s extglob   ## needed in bash only
    setopt ksh_glob   ## needed in zsh only
    mv /source/!(*.bak) /destination
    

    一致するファイルを/source除くすべてのファイルを移動します。 zsh では if to run first を作成することも、より一般的に再度必要な場合 (または名前が Except files などで始まるすべてのファイルに対して) 作成することもできます。/destination*.bak/source/^*.baksetopt extended_globsetopt extended_glob/source/*~*.bak/source/a*~*.baka.bak

  • Zshには、パターンに一致するファイルを除くすべてのファイルを移動するために使用できる一括コピー/移動/リンクコマンドがあります。たとえば、次のコマンドは*.bakfromを除く/sourceすべてのファイルを移動しtarget.bakプロセスにその名前を追加します。

    autoload zmv
    zmv '/source/(*)~*.bak' '/target/$1.bak'
    
  • floatというコマンドがいくつかありますrename。 DebianとUbuntuで/usr/bin/renamePerl式によって生成された新しい名前にファイルを移動するPerlスクリプト。ファイルを除外する場合は、新しい名前を生成しないことでファイル名の変更を除外できます。たとえば、次のコマンド(この特定のプログラムを使用)は、renamefromを除くすべてのファイルを次に移動します。*.bak/source/target

    rename 's!/source!/target! unless m!\.bak$!' /source/*
    
  • このfindコマンドを使用して、移動するファイルを選択できます。たとえば、次のコマンドは、またはサブディレクトリを除くすべての一般的なファイルを次に*.bak移動します(ディレクトリ構造は縮小されています)。/source/target

    find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
    

    または(移動するファイルが多い場合はより効率的です)

    find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
    
  • rsyncこれは包含/除外規則を一般化したものであり、cp非常にscp強力な包含/除外規則を持っています。たとえば、次のコマンドはディレクトリ構造を考慮して、またはサブディレクトリを除くすべてのファイルを*.bakコピーします。/source/target

    rsync -a --exclude '*.bak' /source/ /target/
    
  • pax(何よりも)もう一つのcpステロイドです。除外ルールはrsyncほど強力ではありませんが、ファイルのコピー時に名前を変更する追加機能があります。ファイル名を空の文字列に変更すると、コピーから除外されます。たとえば、次のコマンドは、またはサブディレクトリを除くすべてのファイル*.bakをにコピーし、ファイル名をに変更します。/source/target.bak

    cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
    

    上記の例には、というディレクトリを作成する不幸な副作用がありますfoo.bak。これは次のものfindと組み合わせて回避できますpax

    { cd /source && find . -type f; } | \
    pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
    

おすすめ記事