Перемещение всех файлов с одинаковым расширением .txt в новый каталог.

Поместите резервную копию в безопасное место. После любой установки/обновления немедленно замените определенные файлы из этой резервной копии -. Таким образом, никаких ошибок, которые могут испортить установку, вы все равно получите файл (s ), который хотели сохранить.

3
23.12.2019, 17:38
5 ответов

Это приведет к перемещению всех файлов с расширениями .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, если только это не требуется для выполнения поставленной задачи.

1
27.01.2020, 21:17

попробуйте это из каталога верхнего уровня , где расположены подкаталоги:

sudo find. -type f -iname '*.txt' -exec echo {}  \;

и если список найденных файлов показывает список рассматриваемых текстовых файлов, выполните:

sudo find. -path ~/Desktop/tmpremo -prune -o -type f -iname '*.txt' -exec mv {} ~/Desktop/tmpremo/ \;
0
27.01.2020, 21:17

(здесь новичок, поэтому я не могу комментировать ответ @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обрабатывается как то, что должно рассматриваться в данном случае, как команда, а не строка.

1
27.01.2020, 21:17

Вы получаете сообщение об ошибке, потому что **/*.txtрасширен со всеми соответствующими файлами (с полными путями )в виде очень длинной командной строки, и существует ограничение на длину аргументов.

Проблема с использованием find... -exec mvзаключается в том, что вы запускаете mvодин раз для каждого файла.

Существует команда, которая будет пытаться запускать команды с максимально допустимым количеством аргументов :xargs, поэтому вам просто нужно передать вывод findв xargsи указать xargsзапуститьmv(аргументы по умолчанию добавляются в конце):

find. -type f -name '*.txt' -print0 | xargs -0 mv -t ~/Desktop/tmpremo

PS :Я удивлен, что вам приходится использовать sudoдля перемещения файлов внутри ваших пользовательских каталогов.

1
27.01.2020, 21:17

Поскольку вы уже используете **, почему бы не сделать простой цикл?

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

1
27.01.2020, 21:17

Теги

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