web-dev-qa-db-ja.com

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

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

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

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

以下を.bashrcに追加します

shopt -s extglob

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

mv !(fileOne) ~/path/newFolder

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

ディレクトリのコピーでは、スレッドで通知されているように、名前にフォワードフラッシュを使用できないことに注意してください 条件以外のブレーク以外のext​​globが必要な理由

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

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

Bashを使用し、extglob Shellオプションが設定されている場合(通常はこのようになります):

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

私は伝統的な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
21
John T

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

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

17
Rohail Abbas

Bashの場合、 sth answer が正しいです。 zsh (選択したシェル)の構文は次のとおりです。

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

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

13
Juliano

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

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
13
alex.pilon

次の方法は100%保証された方法ではないため、スクリプトを作成することは一切試みないでください。ただし、場合によっては、インタラクティブなシェルをすばやく使用するには十分です。次のようなファイルファイルグロブ

[abc]*

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

[^abc]*

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

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

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

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

Findコマンドはすべての通常ファイルをリストし、fgrepコマンドはTux.pngを除外します。バックティックは、結果のファイルリストを移動するようmvに指示します。

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

どうですか:

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

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

3
antibus

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

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

フォルダー内のすべてを移動してから、Tux.pngを戻すだけではどうですか?

「...を除くすべて」と言われるようなシェル構文は考えられません。

2
David Z