/ / Перемістити всі файли крім одного - linux, bash, glob

Перемістити всі файли, крім одного - linux, bash, glob

Як я можу перемістити всі файли, крім одного? Я шукаю щось на кшталт:

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

де я переміщую старі речі до нового матеріалу-папки окрім Tux.png. ! -sign означає заперечення. Чи є якийсь інструмент для роботи?

Відповіді:

116 для відповіді № 1

Якщо ви використовуєте bash і є extglob Набір опцій оболонки (що зазвичай має місце):

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

80 за відповідь № 2

Покладіть наступне до вашого .bashrc

shopt -s extglob

Це розширює регулярні вирази. Після цього можна перемістити всі файли, крім одного

mv !(fileOne) ~/path/newFolder

Винятки щодо інших команд

Зауважте, що при копіюванні каталогів прямий спалах не може використовуватися в назві, як це було помічено в потоці Чому витягнути, крім розірвання, крім стану?:

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

так Backups.backupdb/ це неправильно, перш ніж це заперечення, і я б не використовував його ні в рухомих каталогах, ні внаслідок ризику помилково використати глобуси з іншими командами та можливими іншими винятками.


64 для відповіді № 3

Я б пішов з традиційним методом 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 шлях у результат. Працює з будь-якими іменами файлів, у тому числі з тими, що містять вбудовані нові рядки.

Один коментар зауважує, що mv -t варіант - це, ймовірно, GNU-розширення. Для систем, які не мають цього

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png 
-exec mv "{}" ~/Linux/New ;

16 за відповідь № 4

Швидкий спосіб полягає в тому, щоб змінити назву файлу tux, щоб команда вашого переміщення не збігалася.

Наприклад:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

13 за відповідь № 5

Для башу, sth відповідь правильно. Ось це zsh (моя оболонка вибору) синтаксис:

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

Потрібен EXTENDED_GLOB Параметр оболонки встановлюється.


11 за відповідь № 6

Я вважаю, що це трохи безпечніше і легше покладатися на прості кроки, які виключають певні файли або каталоги.

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

11 для відповіді № 7

Я думаю, що найпростіший спосіб це робити - з заставками

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/

Спасибі @ Арнольд Роа


5 для відповіді № 8

Нижче наведено не 100% гарантований спосіб, і взагалі не слід намагатися скриптування. Але кілька разів це досить добре для швидкого інтерактивного використання оболонки. Файловий файл glob, як

[abc]*

(який буде відповідати всім файлам з іменами, що починаються з a, b або c) може бути відхилено шляхом вставки символу "^" спочатку, тобто

[^abc]*

Я іноді використовую це для невідповідності каталогу "lost + found", наприклад, наприклад:

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

Звичайно, якщо є інші файли, починаючи з l я повинен обробляти їх пізніше.


3 для відповіді № 9
mv `find Linux/Old "!" -type d | fgrep -v Tux.png` Linux/New

Команда find містить всі звичайні файли, і команда fgrep відфільтровує будь-який Tux.png. Затінки повідомляють mv для переміщення результуючого списку файлів.


3 для відповіді № 10
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/"

2 для відповіді № 11

Як щодо вас перемістити все в папку, а потім просто перемістити Tux.png назад?

Я не можу думати про будь-який синтаксис оболонки, щоб сказати "все, крім ..." звідти.


1 для відповіді № 12

Можна пропустити grep подобається це:

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