Если Вы хотите переместить квоту от места перед числом к месту перед запятой, то можно использовать группировку
%s/'\([0-9]\),/\1',/
или помещать другую кавычку перед запятой, просто включайте его в первую группу:
%s/\('[0-9]\),/\1',/
В GNU mv:
find path_A -name '*AAA*' -exec mv -t path_B {} +
В этом случае будет использоваться опция find -exec
, которая по очереди заменяет {}
на каждый результат поиска и выполняет команду, которую вы ему даете. Как объяснялось в man find
:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered.
В данном случае мы используем +
версию -exec
для того, чтобы выполнить как можно меньше операций mv
:
-exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca‐
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of `{}'
is allowed within the command. The command is executed in the
starting directory.
-exec
- лучший способ сделать это. Если по какой-либо причине это не вариант, вы также можете прочитать результаты в цикле:
find path_A -name "*AAA*" -print0 |
while IFS= read -r -d $'\0' file; do mv "$file" path_B; done
Это безопасный способ, он может работать с именами файлов, которые содержат пробелы, новые строки или другие странные символы. Более простой способ, который не работает, если имена ваших файлов не состоят только из простых буквенно-цифровых символов , - это
mv $(find path_A -name "*AAA*") path_B
. Но используйте цикл while.
Ты можешь сделать что-нибудь вроде ниже.
find path_A -name "*AAA*" -print0 | xargs -0 -I {} mv {} path_B
Где,
-0
Если есть пустые пробелы или символы (включая новые строки), многие команды не будут работать. Эта опция заботится об именах файлов с помощью
пустое место. -I
Заменить вхождения replace-str в исходные документы именами, считываемыми со стандартного входа. Также, пустые места без кавычек не
завершить ввод элементов; вместо этого разделителем является новая строка
характер. Тестирование
Я создал два каталога в качестве sourcedir
и destdir
. Теперь я создал кучу файлов внутри исходника sourcedir
в виде file1.bak
, file2.bak
и file3 с пробелами. bak
Теперь я выполнил команду как,
find . -name "*.bak" -print0 | xargs -0 -I {} mv {} /destdir/
Теперь, внутри destdir
, когда я сделал ls
, я увидел, что файлы переместились из sourcedir
в destdir
.
Ссылки
http://www.cyberciti. biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
Другой способ
for f in `find path_A -name "*AAA*"`; do mv $f /destination/dir/; done
Для пользователей OS X, которые сталкиваются с этим вопросом, синтаксис OS X немного отличается. Предполагая, что вы не хотите рекурсивно искать в подкаталогах path_A
:
find path_A -maxdepth 1 -name "*AAA*" -exec mv {} path_B \;
Если вы хотите рекурсивно искать все файлы в path_A
:
find path_A -name "*AAA*" -exec mv {} path_B \;
Использование только функций POSIX для find
(и также для mv
):
find path_A -name '*AAA*' -exec sh -c 'mv "$@" path_B' find-sh {} +
Дополнительная литература: