Команда, которую вы ищете
mv * .[^.]* ..
или (см. ниже для получения дополнительной информации):
(shopt -s dotglob; mv -- * ..)
Объяснение: mv
команда перемещает файлы и каталоги. Последний аргумент mv
- это цель (в этом случае каталог на один шаг вверх по дереву ..
). Аргументами до этого являются исходные файлы и каталоги. Звездочка ( *
) - это подстановочный знак, который соответствует всем файлам, которые не начинаются с точки. Файлы, начинающиеся с точки (точечные файлы), «скрыты». Они сопоставляются с использованием шаблона .[^.]*
(см. Редактирование ниже).
Смотрите man-страницу, на которую я ссылаюсь, для получения дополнительной информации mv
.
Почему .[^.]*
вместо .*
?
Как правильно указывает Крис Джонсен : картина .*
также совпадает .
и ..
. Поскольку вы не хотите (и не можете) перемещать их, лучше использовать шаблон, который соответствует любому имени файла, начинающемуся с точки, кроме этих двух . Шаблон .[^.]*
делает именно это: он соответствует любому имени файла (1), начиная с точки (2), за которой следует символ, который не является точкой (3), за которой следует ноль или более произвольных символов.
Как указывает Паггас , нам также нужно добавить шаблон, чтобы сопоставить файлы, начинающиеся с двух точек. Смотрите его ответ для альтернативного решения, используя ..??*
find
В ответеshopt
Арджана упоминается, чтобы избежать всех этих проблем с точечными файлами. Но тогда проблема с файлами начинается с тире. И это требует трех команд. Тем не менее, мне нравится идея. Я предлагаю использовать это так:
(shopt -s dotglob; mv -- * ..)
Это выполняется shopt
в подоболочке (таким образом, нет второго обращения к shopt
обязательному) и использует его --
так, что файлы, начинающиеся с тире, не будут интерпретироваться как аргументы mv
.