Файл в папку .bat в .sh - PullRequest
0 голосов
/ 20 мая 2018

У меня есть старый файл .bat, который мне нужно запустить на моем QNAP.Мне нужно рекурсивно создавать папки для каждого файла (на основе имени файла), а затем перемещать файл в эту папку.

Вот старый .bat:

@echo off 
for %%a in (*.*) do (md "%%~na" 2>nul
move "%%a" "%%~na"
)

1 Ответ

0 голосов
/ 20 мая 2018

Если я правильно понимаю синтаксис .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

Однако у нее есть небольшая проблема: если имя файла содержит символ перевода строки, оно может не обработать это имя файлаправильно.Но если в именах ваших файлов есть только символы хорошего поведения, этого должно быть достаточно.

...