Як я можу перемістити всі файли, крім одного? Я шукаю щось на зразок:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
де я переміщую старі речі до нових, крім папки Tux.png
. ! -знак являє собою заперечення. Чи є якийсь інструмент для роботи?
Як я можу перемістити всі файли, крім одного? Я шукаю щось на зразок:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
де я переміщую старі речі до нових, крім папки Tux.png
. ! -знак являє собою заперечення. Чи є якийсь інструмент для роботи?
Відповіді:
Якщо ви використовуєте bash і встановлено параметр extglob
оболонки (як правило):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
Покладіть наступне на свій .bashrc
shopt -s extglob
Він розширює регекси. Потім ви можете перемістити всі файли, крім одного
mv !(fileOne) ~/path/newFolder
Зауважте, що при копіюванні каталогів флеш-передача не може бути використана в імені, як помічено в потоці. Чому extglob, крім порушення, крім умови? :
cp -r !(Backups.backupdb) /home/masi/Documents/
тому Backups.backupdb/
помиляється тут перед запереченням, і я не використовував би його ні в переміщенні каталогів через ризик неправильного використання, а потім глобусів з іншими командами та можливих інших винятків.
mv !(arc*) archive_190629b
Я б пішов традиційним способом пошуку & 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
в результат сам шлях. Працює з будь-якими іменами, у тому числі з тими, що містять вбудовані нові рядки.
В одному коментарі зазначається, що -t
опція mv - це, ймовірно, розширення 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
Я думаю, що найпростіший спосіб зробити це з backticks
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
там використовуєте ?
Я вважаю, що це трохи безпечніше і простіше розраховувати на прості кроки, які виключають певні файли чи каталоги.
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
-l
Варіант ls
включатиме в себе багато неактуальною інформації в командному рядку і привести до виходу з ладу команди мв.
Наведене нижче не є 100% гарантованим методом, і його взагалі не слід намагатися використовувати для сценаріїв. Але іноді це досить добре для швидкого використання інтерактивних оболонок. Файл файлів, як глобус
[abc]*
(який буде відповідати всім файлам з іменами, що починаються з a, b або c) можна заперечити, вставивши спочатку символ "^", тобто
[^abc]*
Я іноді використовую це для невідповідності каталогу "втрачено + знайдено", наприклад, наприклад:
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
Звичайно, якщо є інші файли, починаючи з l, я повинен потім їх обробити.
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New
Команда find перераховує всі звичайні файли, а команда fgrep викреслює будь-який Tux.png. Повернення наказує mv переміщувати отриманий список файлів.
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
ls ~/Linux/Old/ | grep -v Tux.png | xargs -I{} mv {} ~/Linux/New/
працює замість цього.
Можна пропустити греп так:
ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
Це може бути простіше і легко запам'ятовується, і це працює для мене.
mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination