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

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

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

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

Ответ 1

Поместите следующее на ваш .bashrc

shopt -s extglob

Он расширяет регулярные выражения. Затем вы можете перемещать все файлы, кроме одного, на

mv !(fileOne) ~/path/newFolder

Исключения по отношению к другим командам

Обратите внимание, что при копировании каталогов форвардная вспышка не может использоваться в имени, как отмечено в потоке Почему extglob исключает нарушение, кроме условия?:

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

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

Ответ 2

Если вы используете bash и установите параметр оболочки extglob (что обычно бывает):

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

Ответ 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 \;

Ответ 4

Быстрый способ - изменить имя файла tux, чтобы ваша команда перемещения не соответствовала.

Например:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

Ответ 5

Я думаю, что самый простой способ сделать это с 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/

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

Ответ 6

Для bash, sth answer является правильным. Ниже представлен синтаксис zsh (моя оболочка выбора):

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

Требуется установить параметр EXTENDED_GLOB shell.

Ответ 7

Я считаю, что это немного безопаснее и проще полагаться на простые ходы, которые исключают определенные файлы или каталоги.

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

Ответ 8

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

[abc]*

(который будет соответствовать всем файлам с именами, начинающимися с a, b или c), можно скрыть, вставив сначала символ "^", т.е.

[^abc]*

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

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

Конечно, если есть другие файлы, начиная с l, я должен обработать их позже.

Ответ 9

mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New

Команда find отображает все обычные файлы, и команда fgrep фильтрует любой Tux.png. Выходы подсказывают mv, чтобы переместить результирующий список файлов.

Ответ 10

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

Ответ 11

Как насчет того, что вы перемещаете все в папке, а затем просто переместите Tux.png назад?

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

Ответ 12

Можно пропустить grep следующим образом:

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

Ответ 13

Как насчет:

mv $(echo * | sed s:Tux.png::g) ~/Linux/New/

Вы должны быть в папке, хотя.