Як я можу перемістити всі файли, крім одного? Я шукаю щось на кшталт:
"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/