Как переместить все файлы в текущей папке в подпапку?

70

Я нахожусь на пути:

/myuser/downloads/

И я создаю подпапку:

/myuser/downloads/new

Теперь я хочу переместить все файлы и папки / подпапки в папке загрузок в подпапку.

как я могу это сделать?

Я пытался:

mv -R *.* new/

Но для перемещения не нужен ключ -R.

Бланкмэн
источник
4
Вам не нужно -R. Просто mv * new, он будет скулить "не может перейти с нового на новое" или что-то подобное. Возможно, mv -i * newвам мешают перезаписать.

Ответы:

101

Команда

mv !(new) new

должен сделать свое дело. Если это не работает, запустите shopt -s extglobсначала.

Чтобы также переместить скрытые файлы / каталоги (начинающиеся с точки), shopt -s dotglobсначала запустите также .
Итак, подведем итог:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(всегда лучше сбрасывать, dotglobчтобы избежать неприятных сюрпризов).

enzotib
источник
5
Можете ли вы упомянуть, в чем значение !(something)?
Aererlike
2
@adeer, который просто говорит нет (что-то). Другими словами, скопируйте все, но не что-то. Ясно как грязь?
RockyMountainHigh
4
очень. ты случайно не знаешь эквивалент для zsh?
Aererlike
1
Я не понимаю, например, что если я попытаюсь переместить содержимое папки devв мое текущее местоположение, мне нужно выполнить mv !(dev) dev? Я получаю-bash: !: event not found
Black
5
@adeer очень похож. setopt extendedglobустановить расширенный режим glob в zsh. ^является символом исключения, поэтому mv ^new newсделал бы свое дело. затем, чтобы увидеть все параметры, установленные в zsh, которые вы можете использовать, setoptи отключить режим расширенного глобуса, который вы можете сделатьunsetopt extendedglob
Mr. T
10

Я нашел что-то вроде этого, но это немного проще для понимания, и это может хорошо работать и для вас:

ls | grep -v new | xargs mv -t new

Добавление объяснения к вышеуказанному решению:

С man-страниц:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

Объясняется шаг за шагом:

  • ls перечислит файлы в текущем каталоге
  • grep -v new вернется по трубопроводу, что не соответствует новому
  • xargs mv -t newпереместит переданные ему файлы из grep -vв целевой каталог
lockwobr
источник
Я попробовал этот метод , но я получаю: mv: illegal option -- t. Это потому что я пользуюсь zsh?
ConstantFun
@ConstantFun Это может быть zsh, но я предполагаю, что это ваша реализация mv(то есть ваша версия mv отличается от той, которую я использовал), какую ОС вы используете? Я считаю , что , когда я писал этот ответ , я был на дистрибутиве с centosпомощью bash.
lockwobr
2
Просто тестирую это на osx, и я получаю ту же ошибку, mv: illegal option -- tпотому что у mv osx нет -tопции.
lockwobr
1
(Я не пробовал это, и не планирую это.) Эта ссылка apple.stackexchange.com/questions/69223/… рассказывает, как установить gnucore, который должен помочь вам получить основные утилиты gnu, osx поставляется с bsd Cli инструменты, которые отличаются от тех, которые идут с Linux.
lockwobr
Я на OSX запущен zsh, так что это, вероятно, ОС тогда ..? Спасибо за разъяснение!
ConstantFun
7

Простая идея Предполагая , что вы находитесь в / MyUser , переименовывать загрузки в новый , создать новый загрузок каталог затем переместить новый в него.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.
jpezz
источник
1

Если вы хотите переместить все файлы из папки в одну из ее подпапок, вы можете использовать следующую команду:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

Он найдет все файлы и затем переместит их в вашу подпапку.

@waltinator: добавлено -type d -name 'new' -pruneдля предотвращения обхода /myuser/downloads/new.

Демьян
источник
Я создал подкаталог с именем newи попробовал эту команду, я получаю mv: missing file operandиTry 'mv --help' for more information
mook765
1

Вы можете попробовать этот альтернативный процесс - остаться на пути

/myuser/downloads/

но, вместо того , чтобы первые создания /myuser/downloads/new/каталога, вместо того, чтобы создать папку в /myuser/директории, с командой mkdir ../new, а затем переместить все файлы downloadsк new, и , наконец , перейти newв downloads. Вы можете сделать это в одной строке, находясь в /myuser/downloads/пути, с помощью команды:

mkdir ../new && mv * ../new && mv ../new ../downloads

В этом случае вам не придется беспокоиться о каких - либо «фильтрации» файлов / папок, так как newнаходится на том же уровне , как путь downloads, так что вы можете просто переместить все в downloadsк new, а затем перейти newв downloads`.

Однако, если у вас уже есть newсозданная подпапка и вы не хотите создавать другую, не беспокойтесь - просто измените mkdirкоманду слева от первой &&в команде, показанной выше, на mvкоманду, нажимая newвверх в дорожка; другими словами, пока вы еще в игре /myuser/downloads/, вы можете перейти mkdir ../newна mv new ... Затем подпапка new[в пути /myuser/downloads/new/] перемещается вверх /myuser/new/на том же уровне /myuser/downloads/, что и вы можете выполнить остальную часть команды, как показано выше. Все вместе мы имеем, начиная с пути /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

и, поскольку вы хотите «переместить все файлы и папки / подпапки в папке загрузок в подпапку [ new]», все готово! Если вы хотите переместить только файлы (или только папки или [вставить более детализированное движение объекта]), вам придется использовать другие команды, которые могут «фильтровать» объекты, например grep. Команды, написанные выше, достаточно для ваших целей.

adamcatto
источник