Как интегрировать команду mv после того, как находят команду?

Если Вы хотите переместить квоту от места перед числом к месту перед запятой, то можно использовать группировку

%s/'\([0-9]\),/\1',/

или помещать другую кавычку перед запятой, просто включайте его в первую группу:

%s/\('[0-9]\),/\1',/
66
16.09.2015, 11:38
6 ответов

В 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.
91
27.01.2020, 19:31

-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.

6
27.01.2020, 19:31

Ты можешь сделать что-нибудь вроде ниже.

find path_A -name "*AAA*" -print0 | xargs -0 -I {} mv {} path_B

Где,

  1. -0 Если есть пустые пробелы или символы (включая новые строки), многие команды не будут работать. Эта опция заботится об именах файлов с помощью пустое место.
  2. -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/

24
27.01.2020, 19:31

Другой способ

for f in `find path_A -name "*AAA*"`; do mv $f /destination/dir/; done
2
27.01.2020, 19:31

Для пользователей 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 \;
23
27.01.2020, 19:31

Использование только функций POSIX для find также для mv ):

find path_A -name '*AAA*' -exec sh -c 'mv "$@" path_B' find-sh {} +

Дополнительная литература:

5
27.01.2020, 19:31

Теги

Похожие вопросы