Поместите резервную копию в безопасное место. После любой установки/обновления немедленно замените определенные файлы из этой резервной копии -. Таким образом, никаких ошибок, которые могут испортить установку, вы все равно получите файл (s ), который хотели сохранить.
Это приведет к перемещению всех файлов с расширениями .txt
и .txt.exe
, присутствующих в любом месте внутри текущего каталога (, даже в подкаталогах )в ~/Desktop/tmpremo
.
$ sudo find. -type f \( -iname '*.txt' -o -iname '*.txt.exe' \) -exec mv {} ~/Desktop/tmpremo \;
Если вам нужно еще одно расширение, просто добавьте -o -iname '*.extension'
перед -exec
.
PS :Как заметил @xenoid, воздержитесь от использования sudo
, если только это не требуется для выполнения поставленной задачи.
попробуйте это из каталога верхнего уровня , где расположены подкаталоги:
sudo find. -type f -iname '*.txt' -exec echo {} \;
и если список найденных файлов показывает список рассматриваемых текстовых файлов, выполните:
sudo find. -path ~/Desktop/tmpremo -prune -o -type f -iname '*.txt' -exec mv {} ~/Desktop/tmpremo/ \;
(здесь новичок, поэтому я не могу комментировать ответ @BarBar1234)
Я считаю, что нет необходимости повторять вывод 'find', так как сама команда уже повторяет найденные имена файлов.
Вместо этого вы можете просто использовать:
sudo find. -type f -iname '*.txt'
Но ради сведения, вывод, который вы получали (find: ‘echo./rdggt_169/frretcdd_td.txt ’: No such file or directory
), происходит потому, что в команде
sudo find. -type f -iname '*.txt' -exec 'echo {}' \;
часть, которая говорит -exec 'echo {}'
, дает один аргумент -в кавычках для -exec
, поэтому она обрабатывает всю развернутую строку как команду.
Для ясности: строка 'echo foo/bar.txt' не является командой echo
с аргументом 'foo/bar.txt', поэтому в вашей системе ничего не найдено, потому что в вашем система с именем echo foo/bar.txt
.
Вот почему BarBar1234 только что отредактировал ответ, удалив одинарные кавычки. Теперь echo
обрабатывается как то, что должно рассматриваться в данном случае, как команда, а не строка.
Вы получаете сообщение об ошибке, потому что **/*.txt
расширен со всеми соответствующими файлами (с полными путями )в виде очень длинной командной строки, и существует ограничение на длину аргументов.
Проблема с использованием find... -exec mv
заключается в том, что вы запускаете mv
один раз для каждого файла.
Существует команда, которая будет пытаться запускать команды с максимально допустимым количеством аргументов :xargs
, поэтому вам просто нужно передать вывод find
в xargs
и указать xargs
запуститьmv
(аргументы по умолчанию добавляются в конце):
find. -type f -name '*.txt' -print0 | xargs -0 mv -t ~/Desktop/tmpremo
PS :Я удивлен, что вам приходится использовать sudo
для перемещения файлов внутри ваших пользовательских каталогов.
Поскольку вы уже используете **
, почему бы не сделать простой цикл?
for name in./**/*.txt./**/*.txt.exe; do
mv "$name" "$HOME/Desktop/tmpremo"
done
Ошибка Argument list too long
возникает из-за того, что оболочка пытается выполнить команду со слишком большим количеством/длинными аргументами. Это ограничение в одной из exec()
семейства библиотечных функций C, которая имеет ограничение на сумму длины аргументов и совокупный размер всех переменных окружения (в Linux, с каждым немного сложнее Я также считаю, что аргумент имеет максимально допустимую длину, но это детали ).
Из вашего сообщения об ошибке я вижу, что вы используете bash
, но если бы вы были пользователем zsh
и имели GNU mv
, вместо этого вы могли бы использовать
autoload -U zargs
zargs --./**/*.txt(.)./**/*.txt.exe(.) -- mv -t "$HOME/Desktop/tmpremo"
Утилита zargs
немного похожа на xargs
, но реализована как загружаемая zsh
функция оболочки. См. zargs --help
перед загрузкой и руководство zshcontrib(1)
.