12 ответов:
Если вы используете bash и есть
extglobнабор опций оболочки (что обычно имеет место):mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
ставим следующий код .bashrc
shopt -s extglobОн расширяет регулярные выражения. Затем вы можете переместить все файлы, кроме одного по
mv !(fileOne) ~/path/newFolderисключения по отношению к другим командам
обратите внимание, что при копировании каталогов forward-flash не может использоваться в имени, как указано в потоке почему extglob за исключением разрыва, кроме состояния?:
cp -r !(Backups.backupdb) /home/masi/Documents/так
Backups.backupdb/здесь неправильно перед отрицанием, и я бы не использовал его ни в перемещение каталогов из-за риска неправильного использования затем глобусов с другими командами и возможными другими исключениями.
Я бы пошел с традиционным способом 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 \;
быстрый способ-изменить имя файла 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/Edit:
вместо этого используйте обратную косую черту с ls, чтобы предотвратить ее использование с псевдонимом, т. е. в основном LS имеет псевдоним ls --color.
mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/Спасибо @Arnold Roa
Я считаю, что это немного безопаснее и проще полагаться на простые шаги, которые исключают определенные файлы или каталоги.
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
следующее не является 100% гарантированным методом и вообще не должно быть предпринято для сценариев. Но иногда это достаточно хорошо для быстрого использования интерактивной оболочки. Файл файл glob, как
[abc]*(который будет соответствовать всем файлам с именами, начинающимися с a, b или c) можно отменить, вставив сначала символ"^", т. е.
[^abc]*Я иногда использую это для того, чтобы не соответствовать каталогу "lost+found", например:
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 переместить результирующий список файлов.
Как насчет того, чтобы переместить все в папку, а затем просто переместить смокинг.ПНГ вернулся?
Я не могу придумать синтаксис оболочки, чтобы сказать "все, кроме ..." экспромтом.
можно пропустить grep такой:
ls ~/Linux/Old/ -Q1I Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
Comments