Переместить все файлы кроме одного



Как я могу переместить все файлы кроме одного? Я ищу что-то вроде:



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


где я перемещаю старые вещи в новую папку, кроме Tux.png. !-знак представляет собой отрицание. Есть ли какой-то инструмент для работы?

682   12  

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

на bash sth ответ является правильным. Вот это zsh (моя оболочка выбора) синтаксис:

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

требует EXTENDED_GLOB параметр оболочки, который будет установлен.

Я думаю, что самый простой способ сделать это с помощью 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 переместить результирующий список файлов.

ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'

Как насчет того, чтобы переместить все в папку, а затем просто переместить смокинг.ПНГ вернулся?

Я не могу придумать синтаксис оболочки, чтобы сказать "все, кроме ..." экспромтом.

можно пропустить grep такой:

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

Comments

    Ничего не найдено.