Команда, которую Вы ищете,
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
.
Короткий ответ: использовать
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Длинный ответ:
Команда
mv * .* ..
не будет работать с тех пор .*
может соответствовать .
и ..
. Но команда
mv * .[^.]* ..
не будет также работать, с тех пор .[^.]*
не будет соответствовать, например, ..filename
! Вместо этого то, что я делаю,
mv * .[^.] .??* ..
который будет соответствовать всему кроме .
и ..
. *
будет соответствовать всему, что не запускается с a .
, .[^.]
будет соответствовать всем 2 символьным именам файлов, запускающимся с точки кроме ..
, и .??*
будет соответствовать всем именам файлов, запускающимся с точки по крайней мере с 3 символами.
Еще лучше можно использовать
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
который избегает ужасных взломов шарика в mv * .[^.] .??* ..
!
В конечном счете попытка mv .
перестанет работать, потому что mv не сможет удалить связь с каталогом, в котором Вы в настоящее время находитесь. Вы могли mv * ..
перемещать файлы в cwd.
mv * .??* ../.
*
получает все не - точечные файлы. .??*
получает все. файлы по крайней мере три байта длиной, который работает на все законные. Что-нибудь Вы, вероятно, хотите rm
вместо mv
так или иначе.
../.
не предлагает прямых преимуществ ..
но при выполнении перемещения к каталогу это - очень хорошая привычка войти, потому что это перестанет работать, как Вы хотите, если существует что-то не так с путем. Например, mv xyz bletch
, где Вы думаете bletch
каталог, может быть сделан более бесспорным с mv xyz bletch/.
.