1つを除くすべてのファイルを移動する


155

1つを除くすべてのファイルを移動するにはどうすればよいですか?私は次のようなものを探しています:

'mv ~/Linux/Old/!Tux.png ~/Linux/New/'

古いものを新しいものフォルダに移動する場所を除いてTux.png。!記号は否定を表します。仕事のためのツールはありますか?

回答:


142

bashを使用し、extglobシェルオプションを設定している場合(通常はそうです):

mv ~/Linux/Old/!(Tux.png) ~/Linux/New/

1
多くのアイテムのコマンドをテストしたときに、何か問題が発生しました:mv〜/ Linux / Old /!なにが問題ですか?
レオ・レオポルド・ヘルツ준 영

5
@UnixBasics、試してください:〜/ Linux / Old /!(Tux.png | Tux1.png | Tux2.png)
Juliano

@ジュリアーノ非常にクールなコマンド!ORやXORなどの数学演算はありますか?パイプはAND用だと思います。
レオ・レオポルド・ヘルツ준 영


@Juliano私は次のようなパターンにかなり混乱しています:mv〜/ Linux /?(Tux * .png)〜/ Linux / New / mv〜/ Linux / +(Tux * .png)〜/ Linux / New /前者では、0-1 Tux -photoを動かしたかった。後者では、1-n Tuxの写真を移動したかった。彼らはすべてを動かした。どうして?特定の量の写真を移動することは可能ですか?
レオ・レオポルド・ヘルツ준 영

97

以下を.bashrcに入れてください

shopt -s extglob

正規表現を拡張します。その後、1つを除くすべてのファイルを移動できます。

mv !(fileOne) ~/path/newFolder

他のコマンドに関する例外

ディレクトリのコピーでは、スレッドで通知されているように、名前にforward-flashを使用できないことに注意してください

cp -r !(Backups.backupdb) /home/masi/Documents/

Backups.backupdb/否定の前にここで間違っているので、他のコマンドでグロブを誤って使用するリスクと他の例外の可能性があるため、移動ディレクトリでも使用しません。


3
これが正解です。鉱山は完全に間違っていた。幸い、ファイルがほとんどないフォルダで使用していました。以下は、Masiが示すメソッドの詳細です。wiki.bash-hackers.org / syntax/ pattern「拡張パターン言語」に移動すると、この詳細情報が見つかります。問題を指摘してくれた@ paul-whittakerに感謝します。
ミモレラ2014

これは古い答えですが、まだ有効です。Ubuntu 18を使用していますが、extglobはデフォルトで有効になっているようです(私は購入していません)。私は他のアーカイブフォルダを含まない、このディレクトリ内にあるアーカイブに、現在のディレクトリ内のすべてのファイルを移動するには、次のコマンドを使用: mv !(arc*) archive_190629b
TonyG

70

私は伝統的な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 \;

1
強力なツールの学習を奨励するため、賛成です。空白を含むファイルの場合、これは機能しません。"find -print0 | xargs -0"またはそれ以外のforego xargsを検討してください: "find [言ったこと] -exec mv -t {}〜/ Linux / New \;"
JasonSmith 2009年

mvコマンドに-tオプションがない場合は、「find ... -exec mv {} Linux / New \;」を使用します。または「find ... | xargs -I {} mv {} Linux / New」。-tオプションはGNU拡張機能のようですが、これはLinuxには問題ありませんが、おそらく他の場所にはありません。
ロブ・ケネディ

jhs、ああ、私は失敗します。どういうわけか、xargsは改行で分割され、スペースでは分割されないと考えました。"read"と混同したように見えます:)悪い修正
Johannes Schaub-litb

素晴らしいヒントをありがとう!質問を対象にしているので、sthを選択しました。ただし、コマンドの有用性は後で感じるので、「検索とxargs」の方法を選択する必要があります。それはただ揺れる。おかげで:)
レオ・レオポルド・ヘルツ준 영

複雑化する方法。Masiの回答はより完全で、より簡単で、そのためより正確です
user637338

30

簡単な方法は、移動コマンドが一致しないようにtuxファイル名を変更することです。

例えば:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

」を使用しないでください」を持つファイルのみが移動されます。名前に。「*」だけで十分です。
ジュリアーノ

1
*に変更すると、名前を変更したファイルも削除されます。
ジョンT

6
@John T:いいえ、*グロブはドットで始まるファイルと一致しません。
ビルカーウィン

これは断然最良の答えです。この回答を変更したりコメントしたりする必要はありません。100点。ありがとうございます。よくやった!
スティーブK

23

私は最も簡単な方法はバックティックを使うことだと思います

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


1
なぜそこで使うのか説明してもらえますgrep -vか?
レオ・レオポルド・ヘルツ준 영

1
grepの-vオプションは結果を除外します。Tux.pngを除くすべてのものを取得するようなものです
Rohail Abbas

1
これは確かに直感的ですが、上記の答えの方が優れています。スクリプトを書いている場合は、例えば、これはあなたが正しいディレクトリにあることが必要であろう。..
nJGL

@nJGLここでも絶対パスを指定できます。質問にこれがあったため、ホームディレクトリ(〜)を使用しました
Rohail Abbas

@RohailAbbas結構です。✌️
nJGL

14

bashの場合、sthの答えは正しいです。これがzsh(選択した私のシェル)構文です。

mv ~/Linux/Old/^Tux.png ~/Linux/New/

EXTENDED_GLOBシェルオプションを設定する必要があります。


3
2つのファイルを除外する場合はどうなりますか?
mpen 2017年

13

これは、特定のファイルまたはディレクトリを除外する単純な移動を行う場合に、少し安全で信頼しやすいと思います。

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET

これはBusybox / ASHに最適なソリューションです
スチュアートカードール2015

1
これは、いくつかのフォルダーを除くすべてのファイルを別のディレクトリに移動しなければならない状況でうまくいきました
Umar Hayat

-lオプションでlsは、コマンドラインに多くの無関係な情報が含まれ、mvコマンドが失敗します。
jdhao

5

以下は100%保証された方法ではなく、スクリプトを作成するためにまったく試みられるべきではありません。ただし、インタラクティブなシェルをすばやく使用するには十分な場合もあります。のようなファイルファイルグロブ

[abc]*

(名前がa、b、またはcで始まるすべてのファイルに一致します)は、最初に「^」文字を挿入することで無効にできます。

[^abc]*

たとえば、次のように、「lost + found」ディレクトリに一致しない場合にこれを使用します。

mv /mnt/usbdisk/[^l]* /home/user/stuff/.

もちろん、lで始まる他のファイルがある場合は、後で処理する必要があります。


4
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New

findコマンドはすべての通常のファイルを一覧表示し、fgrepコマンドはTux.pngを除外します。バッククォートはmvに結果のファイルリストを移動するように伝えます。


4
他のコマンドの引数としてfindを評価することは決してありません。悪いことが起こります。脆弱性を作成した可能性があります。常にfind -print0を使用します。xargs -0構文、または-execを見つけます。
ジュリアーノ

3

フォルダ内のすべてを移動してから、Tux.pngを元に戻しますか?

シェル構文で "...以外のすべてのもの"をそのまま書くことは考えられません。


3
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'

1
このコマンドは一部が欠けているようで、私のコンピューターでは動作しません。ls ~/Linux/Old/ | grep -v Tux.png | xargs -I{} mv {} ~/Linux/New/代わりに動作します。
キャサリンチェン

3

どうですか:

mv $(echo * | sed s:Tux.png::g) ~/Linux/New/

ただし、フォルダ内にいる必要があります。


3

次のようにgrepスキップできます。

ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/

1

これはシンプルで覚えやすいかもしれませんが、私にとってはうまくいきます。

mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.