Если я правильно понимаю синтаксис .bat, это должно быть в основном эквивалентно:
#!/bin/sh
for a in *
do
[ ! -f "$a" ] && continue # skip anything that is not a regular file
dirname="${a%.*}" # trim off the last suffix
mkdir -p "$dirname" && mv -i "$a" "$dirname/"
done
Как и оригинал, этот скрипт будет обрабатывать файлы только в текущем каталоге.Если вам нужно обработать текущий каталог и все его ранее существующие подкаталоги (вот как я бы понял «рекурсивно»), он становится немного более сложным, поскольку сценарий должен будет выполняться в глубине, чтобы избежать попытокпомещать файлы в бесконечно глубокие подкаталоги sub-sub-sub ....
В этой ситуации необходимо разработать другое решение, скорее всего, с помощью команды find
для сбора имен файлов.Команда find
по умолчанию является рекурсивной: она автоматически обрабатывает указанный каталог и все его подкаталоги, если вы не указали этого специально.Итак, вот рекурсивная версия, которая может обрабатывать произвольное количество файлов в любом каталоге:
#!/bin/sh
# FIXME: needs more protection against unusual filename characters
find . -type f -depth | while read a
do
dirname="${a%.*}" # trim off the last suffix
mkdir -p "$dirname" && mv -i "$a" "$dirname/"
done
Однако у нее есть небольшая проблема: если имя файла содержит символ перевода строки, оно может не обработать это имя файлаправильно.Но если в именах ваших файлов есть только символы хорошего поведения, этого должно быть достаточно.