косая черта (/) после имени каталога в командах оболочки

14

У меня есть маленький вопрос здесь.

Если у меня есть два файла, скажем , fileaи fileb, mv filea filebбудет

  • удалять fileb
  • переименовать fileaвfileb

Тогда , если у меня есть два каталога, скажем , diraи dirb, mv dira dirbбы

  • двигаться diraв dirb(это станет dirb/dira)

Отмечая, что в обоих случаях нет никакого уведомления или сообщения, то это довольно противоречиво для меня. Я думаю, mv dira dirbследует просто перезаписать dirbсодержимое dira(или объединить две директории в директории с именем dirb).

Я помню, как читал где-то, что имя каталога с косой чертой (как dira/) обрабатывается как каталог, а имя без косой черты (как dira) обрабатывается как файл (в определенных пределах, конечно). В любом случае, теперь я хочу, чтобы оболочка (zsh и, возможно, bash) учитывала мои обозначения каталога, используя косую черту. Есть ли опция терминала, которая позволяет мне применять это?

Чтобы уточнить, вот мое желаемое поведение:

  • mv dira dirbприводит dirbк перезаписи содержимогоdira
  • mv dira dirb/приводит diraк перемещению в dirbdirb/dira)

Кто-нибудь думал так же, как я? Или я просто странный?

phunehehe
источник
2
Я думаю, что ваше желаемое поведение было бы довольно опасно.
звездный синий
@starblue: да, я согласен, что это опасно, но я бы предпочел жить с чем-то опасным, чем несоответствие
phunehehe

Ответы:

11

Да, это немного противоречиво, даже в инструментах GNU.

Одна проблема с вашим предложением состоит в том, что непустые каталоги не могут быть удалены. Кроме того, -T(на земле GNU, во всяком случае) приблизительно соответствует тому, что вы хотите (первый случай):

$ ls dira/ dirb/
dira/:
a

dirb/:
b
$ mv -iT dira/ dirb/
mv: overwrite `dirb/'? y
mv: cannot move `dira/' to `dirb/': Directory not empty
$ rm dirb/b 
$ mv -iT dira/ dirb/
mv: overwrite `dirb/'? y
$ ls dira/ dirb/
ls: cannot access dira/: No such file or directory
dirb/:
a
tshepang
источник
Вы также можете добавить псевдоним, например alias ren=mv -T.
Микель
0

Если вы просто хотите переместить все из диры в дирб, вы можете бежать mv dira/* dirb.

Согласно man-странице mv на моем HP-UX.

The mv command moves:

+ One or more directory subtrees (directory1, [directory2, ...]) to a new or existing directory (dest-directory).

Hemant
источник
3
Ваша команда пропустит все точечные файлы.
qbi
Кому все равно нужны точечные файлы;)
Роберт Массайоли
1
И если это проблема, shopt -s dotglobв bash это исправят.
Дэвид Z