У меня есть каталог, который я пытаюсь очистить, который содержит как файлы, так и подкаталоги. Я пытаюсь сделать все просто: переместить все файлы в другой каталог, но оставить все подкаталоги такими, какие они есть.
Я думаю что-то вроде:
mv [*_but_no_dirs] ./other_directory
Похоже, должен быть простой способ сделать это с помощью символов подстановки *
и регулярных выражений ...
У кого-нибудь есть идеи?
mv **/*(.) ./other_directory
- с bash вам придется прибегать к внешним командам, какfind
, впрочем.Ответы:
Регекс не участвуют здесь. Подстановочные знаки в bash (как и большинство других оболочек) соответствуют файлам только на основе имен файлов, а не на основе типа файла или других характеристик. Существует один способ сопоставления по типу: добавление
/
в конце шаблона позволяет сопоставлять только каталоги или символические ссылки на каталоги. Таким образом, вы можете перемещать каталоги, затем перемещать то, что осталось, и перемещать каталоги назад - громоздко, но это работает.Стандартный способ сопоставления файлов по типу - это вызов
find
.В zsh вы можете использовать glob определители для сопоставления файлов по типу.
.
Отборочные матчи регулярных файлов; используется^/
для сопоставления всех не-каталогов или-^/
для включения символических ссылок на каталоги.В любой оболочке вы можете просто зацикливаться.
источник
Вы могли бы использовать что-то вроде
Сначала мы используем
find
поиск только внутри текущего директоя, затем мы игнорируем каталоги, используя,! -type d
наконец, мы выполняемsh
и перемещаем все в каталог назначения. Вы можете попробовать{} +
в конце, который будет быстрее.источник
-exec sh -c 'mv "$@" MYDIR' _ {} \;
а не-exec mv {} MYDIR \;
? Просто , чтобы получить что - то , что можно рационализировать путем изменения\;
к+
? Вы можете сделать это с помощью-exec mv -t MYDIR {} +
формы.-t
флаге. Я также объяснил в ответе, что+
это быстрее, но не всеfind
версии поддерживают его. Таким образом, приведенный выше код в значительной степени совместим с любой используемойfind
оболочкой.find
оболочкой или оболочкой». Правда, но так и естьfind … -exec mv {} MYDIR \;
, и она использует меньше ресурсов, чем… -exec sh -c 'mv "$@" MYDIR' _ {} \;
.Это потенциально немного опасно, но
Поскольку cp и rm не будут работать с каталогами без ключа -r.
источник
Я бы предложил просто сделать
mv *.* destination/
с пунктом назначения / быть папка, в которую вы перемещаетесь.источник
*.*
некоторые каталоги будут перемещены и останутся некоторые файлы, а это не то, чего хотел просящий.источник