1つを除くすべてのファイルを移動するにはどうすればよいですか?私は次のようなものを探しています:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
古いものを新しいものに移動する場所-Tux.png
を除くフォルダー。 !-signは否定を表します。仕事のためのツールはありますか?
以下を.bashrcに追加します
shopt -s extglob
正規表現を拡張します。その後、1つを除くすべてのファイルを次の方法で移動できます。
mv !(fileOne) ~/path/newFolder
ディレクトリのコピーでは、スレッドで通知されているように、名前にフォワードフラッシュを使用できないことに注意してください 条件以外のブレーク以外のextglobが必要な理由 :
cp -r !(Backups.backupdb) /home/masi/Documents/
したがって、ここでは否定の前にBackups.backupdb/
が間違っています。他のコマンドや他の例外でglobを誤って使用するリスクがあるため、ディレクトリの移動にも使用しません。
Bashを使用し、extglob
Shellオプションが設定されている場合(通常はこのようになります):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
私は伝統的なfind&xargsの方法で行きます:
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 |
xargs -0 mv -t ~/Linux/New
-maxdepth 1
は、再帰的に検索しないようにします。ファイルのみに関心がある場合は、-type f
と言うことができます。 -mindepth 1
は、~/Linux/Old
パス自体を結果に含めないようにします。埋め込まれた改行を含むファイル名を含む、任意のファイル名で動作します。
1つのコメントは、mv -t
オプションがおそらくGNU拡張であることを指摘しています。それを持たないシステムの場合
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
-exec mv '{}' ~/Linux/New \;
簡単な方法は、移動コマンドが一致しないようにTuxファイル名を変更することです。
例えば:
mv Tux.png .Tux.png
mv * ~/somefolder
mv .Tux.png Tux.png
一番簡単な方法はバックティックを使うことだと思います
mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
編集:
代わりにlsでバックスラッシュを使用して、エイリアスで使用しないようにします。つまり、ほとんどの場合、lsはls --colorとしてエイリアスされます。
mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
ありがとう@Arnold Roa
Bashの場合、 sth answer が正しいです。 zsh (選択したシェル)の構文は次のとおりです。
mv ~/Linux/Old/^Tux.png ~/Linux/New/
EXTENDED_GLOB
シェルオプションを設定する必要があります。
これは、特定のファイルまたはディレクトリを除外する単純な移動に頼るのが少し安全で簡単だと思います。
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
次の方法は100%保証された方法ではないため、スクリプトを作成することは一切試みないでください。ただし、場合によっては、インタラクティブなシェルをすばやく使用するには十分です。次のようなファイルファイルグロブ
[abc]*
(名前がa、b、またはcで始まるすべてのファイルに一致します)は、最初に「^」文字を挿入することで無効にできます。
[^abc]*
たとえば、次のように、「lost + found」ディレクトリと一致しない場合にこれを使用します。
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
もちろん、lで始まる他のファイルがある場合、それらを後で処理する必要があります。
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New
Findコマンドはすべての通常ファイルをリストし、fgrepコマンドはTux.pngを除外します。バックティックは、結果のファイルリストを移動するようmvに指示します。
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
どうですか:
mv $(echo * | sed s:Tux.png::g) ~/Linux/New/
ただし、フォルダ内にいる必要があります。
grepをスキップ次のようにできます:
ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
フォルダー内のすべてを移動してから、Tux.pngを戻すだけではどうですか?
「...を除くすべて」と言われるようなシェル構文は考えられません。