Переместить все файлы, кроме одного
Как я могу перемещать все файлы, кроме одного? Я ищу что-то вроде:
'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/
Вы должны быть в папке, хотя.