1つを除くすべてのファイルを移動するにはどうすればよいですか?私は次のようなものを探しています:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
古いものを新しいものフォルダに移動する場所を除いてTux.png
。!記号は否定を表します。仕事のためのツールはありますか?
1つを除くすべてのファイルを移動するにはどうすればよいですか?私は次のようなものを探しています:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
古いものを新しいものフォルダに移動する場所を除いてTux.png
。!記号は否定を表します。仕事のためのツールはありますか?
回答:
bashを使用し、extglob
シェルオプションを設定している場合(通常はそうです):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
以下を.bashrcに入れてください
shopt -s extglob
正規表現を拡張します。その後、1つを除くすべてのファイルを移動できます。
mv !(fileOne) ~/path/newFolder
ディレクトリのコピーでは、スレッドで通知されているように、名前にforward-flashを使用できないことに注意してください。:
cp -r !(Backups.backupdb) /home/masi/Documents/
Backups.backupdb/
否定の前にここで間違っているので、他のコマンドでグロブを誤って使用するリスクと他の例外の可能性があるため、移動ディレクトリでも使用しません。
mv !(arc*) archive_190629b
私は伝統的な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
grep -v
か?
bashの場合、sthの答えは正しいです。これがzsh(選択した私のシェル)構文です。
mv ~/Linux/Old/^Tux.png ~/Linux/New/
EXTENDED_GLOB
シェルオプションを設定する必要があります。
これは、特定のファイルまたはディレクトリを除外する単純な移動を行う場合に、少し安全で信頼しやすいと思います。
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
-l
オプションでls
は、コマンドラインに多くの無関係な情報が含まれ、mvコマンドが失敗します。
以下は100%保証された方法ではなく、スクリプトを作成するためにまったく試みられるべきではありません。ただし、インタラクティブなシェルをすばやく使用するには十分な場合もあります。のようなファイルファイルグロブ
[abc]*
(名前がa、b、またはcで始まるすべてのファイルに一致します)は、最初に「^」文字を挿入することで無効にできます。
[^abc]*
たとえば、次のように、「lost + found」ディレクトリに一致しない場合にこれを使用します。
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
もちろん、lで始まる他のファイルがある場合は、後で処理する必要があります。
次のようにgrepをスキップできます。
ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
これはシンプルで覚えやすいかもしれませんが、私にとってはうまくいきます。
mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination