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

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

Я попробовал что-то как mv *.*, но это не работает.

134
задан 23.07.2014, 15:00

5 ответов

Команда, которую Вы ищете,

mv * .[^.]* ..

или (см. ниже для большего количества информации):

(shopt -s dotglob; mv -- * ..)

Объяснение: mv управляйте файлами перемещений и каталогами. Последний аргумент mv цель (в этом случае каталог, которого каждый повышает в дереве, ..). Аргументы, прежде чем это - исходные файлы и каталоги. Звездочка (*) подстановочный знак, который соответствует всем файлам, которые не запускаются с точки. "Скрыты" файлы, которые запускаются с точки (dotfiles). Они подобраны с помощью шаблона .[^.]* (см. редактирование ниже).

См. страницу справочника, для получения дополнительной информации о которой я связался mv.


Почему .[^.]* вместо .* ?

Поскольку Chris Johnsen правильно указывает: шаблон .* также соответствия . и ... Так как Вы не хотите к (и не может) перемещать их, лучше использовать шаблон, который соответствует любому имени файла, запускающемуся с точки кроме тех двух. Шаблон .[^.]* делает просто что: это соответствует любому имени файла (1) запуск с точки (2), сопровождаемой символом, который не является точкой (3), сопровождаемой нулевыми или более произвольными символами.

Как Paggas указывает, мы должны были бы также добавить шаблон .??* для соответствия файлам, запускающимся с двух точек. См. его ответ для использования альтернативного решения find.

Упоминания ответа Arjan shopt для предотвращения всех тех проблем с dotfiles. Но затем существует все еще проблема с файлами, запускающимися с тире. И требуется три команды. Однако, мне нравится идея. Я предлагаю использовать его как это:

(shopt -s dotglob; mv -- * ..)

Это выполняется shopt в подоболочке (таким образом никакой второй вызов к shopt требуемый) и использование -- так, чтобы файлы, запускающиеся с тире, не были интерпретированы как аргументы mv.

203
ответ дан 07.12.2019, 07:47
  • 1
    Нет никакого вреда в *.* синтаксис - включая.. только опасно при использовании с chmod и показывании и "рекурсивно вызывать" флаг, т.е. chmod-R или показывании-R. И в тех случаях, никогда никогда не вводите показанный.* или chmod.* - показанный главный каталог в пути, который Вы ищете и использует-h (переходит по символьным ссылкам). Но, mv.. просто ничего делать, так волнующиеся об этом. – chris 06.11.2009, 06:16

Короткий ответ: использовать

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

Длинный ответ:

Команда

mv * .* ..

не будет работать с тех пор .* может соответствовать . и ... Но команда

mv * .[^.]* ..

не будет также работать, с тех пор .[^.]* не будет соответствовать, например, ..filename! Вместо этого то, что я делаю,

mv * .[^.] .??* ..

который будет соответствовать всему кроме . и ... * будет соответствовать всему, что не запускается с a ., .[^.] будет соответствовать всем 2 символьным именам файлов, запускающимся с точки кроме .., и .??* будет соответствовать всем именам файлов, запускающимся с точки по крайней мере с 3 символами.

Еще лучше можно использовать

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

который избегает ужасных взломов шарика в mv * .[^.] .??* ..!

42
ответ дан 07.12.2019, 07:47
  • 1
    Что возможно неправильное с попыткой к mv..? Это просто ничего делает и ничего делает. Быть другие команды, где это делает что-то (chmod и показанный) кроме mv, и комната просто ничего делать к. или.. – chris 06.11.2009, 06:18

Только ради полноты, можно также сказать оболочке Bash включать скрытые файлы, с помощью shopt:

shopt -s dotglob
mv -- * ..
shopt -u dotglob
14
ответ дан 07.12.2019, 07:47

В конечном счете попытка mv . перестанет работать, потому что mv не сможет удалить связь с каталогом, в котором Вы в настоящее время находитесь. Вы могли mv * .. перемещать файлы в cwd.

2
ответ дан 07.12.2019, 07:47
mv * .??* ../.

* получает все не - точечные файлы. .??* получает все. файлы по крайней мере три байта длиной, который работает на все законные. Что-нибудь Вы, вероятно, хотите rm вместо mv так или иначе.

../. не предлагает прямых преимуществ .. но при выполнении перемещения к каталогу это - очень хорошая привычка войти, потому что это перестанет работать, как Вы хотите, если существует что-то не так с путем. Например, mv xyz bletch, где Вы думаете bletch каталог, может быть сделан более бесспорным с mv xyz bletch/..

2
ответ дан 07.12.2019, 07:47
  • 1
    Быть никакое различие между../и../. таким образом, я потрудившийся вводить. после наклонной черты. Кроме того, в случае mv и комнаты, это не причиняет вреда, чтобы включать. и.. в списке, т.е. быть ничто страшное или неправильное с mv *.*/path/to/file/, так же, как комната или даже-rf. ничего делала. – chris 06.11.2009, 06:21

Теги

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