Что делает 'mv. /*' не указывая место назначения делают?

То, что делает эта команда, скомпилировать mod_geoip модуль и ссылка это против заголовков версии апача Вы используете.

При использовании запаса пакет Debian Apache затем, просто необходимо установить apache-dev пакет (Вам, конечно, также будет нужно build-essential если у Вас уже нет его). Вы, возможно, должны скорректировать ту команду для путей, которые Debian использует (если они отличаются), но иначе что команда должна хорошо работать.

28
14.08.2013, 12:07
5 ответов

Если последним аргументом был каталог, Вы просто переместили все файлы и каталоги в Вашем текущем рабочем каталоге (кроме тех, имена которых начинаются с точек) в тот каталог. Если было два файла, первый файл, возможно, перезаписал второй файл.

Вот некоторые демонстрации:

Больше чем два файла и последний аргумент являются файлом

$ mkdir d1 d2 d3
$ touch a b c e
$ mv *
mv: target 'e' is not a directory

Больше чем два файла и последний аргумент являются каталогом

$ mkdir d1 d2 d3
$ touch a b c
$ mv -v *
'a' -> 'd3/a'
'b' -> 'd3/b'
'c' -> 'd3/c'
'd1' -> 'd3/d1'
'd2' -> 'd3/d2'

Два файла

$ touch a b
$ mv -v *
'a' -> 'b'

Дальнейшее объяснение

Оболочка разворачивает шарик (*) в аргументы в пользу mv. Шарик обычно расширяется в алфавитном порядке. mv всегда видит список файлов и каталоги. Это никогда не видит сам шарик.

Команда mv поддержки два типа перемещения. Каждый mv file ... directory. Другой mv old-file-name new-file-name (или mv old-file-name directory/new-file-name).

41
27.01.2020, 19:38

Сначала оболочка расширяется ./* во все файлы в текущем каталоге (кроме файлов, запускающихся с точки).

  • если существует не или только один файл: mv сбои
  • если существует два файла: первый перемещен во второе (которые поэтому теряются),
  • если существует больше чем два файла:
    • если последний является каталогом: все файлы перемещены в этот каталог
    • иначе mv сбои.
18
27.01.2020, 19:38
  • 1
    Спасибо. как сказать, какой подкаталог является "последним"? –  StackExchange for All 24.07.2013, 00:58
  • 2
    Просто звоните echo ./* действительно посмотрите который порядок Ваше использование оболочки (обычно алфавитный). –  jofel 24.07.2013, 01:00
  • 3
    Если это перестало работать с одним файлом, почему это не говорит так? –  Noumenon 03.02.2017, 23:47
  • 4
    @Noumenon я не понимаю Ваш комментарий. mv возвращает сообщение об ошибке, если это называют только с одним аргументом. –  jofel 06.02.2017, 14:13
  • 5
    Вы правы. Та же команда из моей истории теперь дает missing destination file operand after *filename*даже при том, что вчера это не сделало. –  Noumenon 06.02.2017, 14:19

Когда Вы вводите mv ./*, Ваша оболочка расширится ./* перед выполнением mv.

Несколько вещей отметить:

  • Если ./* расширен меньше чем в 2 аргумента, mv логически, произведет ошибку.
  • ./* будет обычно расширяться в каждый файл (включая каталог) существующий в текущем каталоге и не запускающийся с точки.
  • Можно управлять что ./* расширяется в путем чтения документации оболочки (man 7 glob точка входа к теме). Различные оболочки будут иметь различные варианты.
4
27.01.2020, 19:38

Что делает mv *?

Вот более короткий ответ:

Оболочка расширяет подстановочный символ * до списка содержимого каталога. Затем оболочка передает этот полный список команде. Команда никогда не видит *.

Команда mv file1 file2 ... filen directory переместит file1 ... filen в каталог.

Пример

Здесь я делаю тестовый каталог, содержащий три файла

$ mkdir t
$ cd t
$ echo a>a; echo b>b; echo c>c
$ ls
a  b  c

Вы не можете переместить несколько файлов в один файл

$ mv *
mv: target `c' is not a directory

Давайте добавим подкаталог

$ mkdir d

Вы можете переместить несколько файлов в подкаталог

$ mv *
$ ls
d
$ ls d
a  b  c
1
27.01.2020, 19:38

Сначала сделаю тестовую базу - 5 файлов и одна папка:

touch file1 file2 file3 file4 file5
mkdir folder

Затем я выполню тестовую команду. Параметр -v указывает, что я хочу, чтобы каждая команда, выполняемая оболочкой, выводилась на stderr . Параметр -x указывает, что я хочу, чтобы то же самое было напечатано на stderr - , но Я хочу, чтобы это было после оценка команды, но до оболочка запускает его.

sh -cxv 'echo mv *'

ВЫВОД

echo mv *
+ echo mv file1 file2 file3 file4 file5 folder
mv file1 file2 file3 file4 file5 folder

Итак, вы видите, что команда, которую я передаю оболочке, - это echo mv * , а команда, выполняемая оболочкой после раскрытия * , - echo mv , за которым следуют все эти файлы и папка.

По умолчанию оболочка расширяет глобусы , например:

sh -cxv 'echo file[1-5]'

ВЫХОД

echo file[1-5]
+ echo file1 file2 file3 file4 file5
file1 file2 file3 file4 file5

Это результат функции set [+ -] f glob:

sh -cxvf 'echo file[1-5]'

ВЫХОД

echo file[1-5]
+ echo 'file[1-5]'
file[1-5]

Таким образом, когда вы запускаете команду в оболочке, настроенной с параметрами по умолчанию, такими как mv * , оболочка раскрывается в слово * , список аргументов всех файлов в текущем каталоге, отсортированных в соответствии с к языку. Он выполняет системный вызов exec (ve) для mv (по сути) с добавленным списком аргументов. Итак, mv получает все аргументы, когда оболочка их объединяет и сортирует. Помимо выполнения strace , чтобы увидеть эти эффекты, вы можете снова использовать отладку, например:

sh -s -- mv * <<\SCRIPT
sed -n l /proc/$$/cmdline
echo "$@"
SCRIPT

OUTPUT

sh\000-s\000--\000mv\000file1\000file2\000file3\000file4\000file5\000folder\
\000$
mv file1 file2 file3 file4 file5 folder

И переносимо:

( PS4= IFS=/; set -x mv *; : "/$*/" ) 2>&1

OUTPUT

: /mv/file1/file2/file3/file4/file5/folder/

В основном оболочка выполняет mv с содержимым каталога (если он не пуст и не включает файлы / папки с именами, начинающимися с . ) в качестве списка аргументов. mv - это POSIX, указанный для интерпретации его последнего аргумента как каталога, если он вызывается с более чем двумя аргументами - точно так же ln равно (потому что на самом деле они Невероятно похожие инструменты в базовых функциях) .

Достаточно echo es:

sh -cxv 'mv *' ; ls

OUTPUT

mv *
+ mv file1 file2 file3 file4 file5 folder
folder/

Все файлы были перемещены в последний аргумент - потому что это папка. Что, если это не папка?

sh -cxv 'cd *; mv *'; ls . *

ВЫХОД

cd *; mv *
+ cd folder
+ mv file1 file2 file3 file4 file5
mv: target ‘file5’ is not a directory

.:
folder/

folder:
file1  file2  file3  file4  file5

Вот как POSIX указывает, что mv должен вести себя в этом случае:

mv [-if] source_file target_file

mv [-if] source_file... target_dir

В первой форме синопсиса Утилита mv должна переместить файл, названный операндом source_file, в место назначения, указанное в target_file . Эта первая форма синопсиса предполагается, когда последний операнд не называет существующий каталог и не является символической ссылкой, относящейся к существующему каталогу. В этом случае, если исходный_файл именует файл, не являющийся каталогом, а целевой_файл заканчивается завершающим символом / косой чертой , mv обрабатывает это как ошибка, и операнды исходный_файл обрабатываться не будут.

Во второй форме синопсиса mv должен переместить каждый файл, названный операндом source_file, в целевой файл в существующем каталоге, названном операндом target_dir , или на который будет ссылка, если target_dir - это символическая ссылка, указывающая на существующий каталог. Путь назначения для каждого исходного_файла должен быть конкатенацией целевого каталога, одним символом / косой чертой , если цель не оканчивается на / косую черту , и последним компонентом имени пути в исходный_файл . Эта вторая форма предполагается, когда последний операнд называет существующий каталог.

Итак, если * расширяется до:

  • два файла

    • У вас должен быть только один файл, который является первым переименованным во второй после того, как второй - ] отключен .
  • один или несколько файлов, за которыми последним следует каталог или ссылка на один

    • У вас должен быть только один каталог или ссылка на один, куда только что было перемещено все предыдущее содержимое его родителя.
  • что-нибудь еще

    • У вас должно быть сообщение об ошибке и удовлетворительный вздох облегчения.
31
27.01.2020, 19:38

Теги

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