Используя файл как вход к сценарию

Вы можете сделать что-то вроде этого:

for dir in ccc ddd lll; do 
    find "main/$dir" -type f -print0 | 
        while IFS= read -r -d '' f; do 
            dd=$(dirname "$f")
            new="${f/main\/}"
            new="${new//\//_}" 
            mv "$f" "$dd"/"$new"
        done
done

После вышеуказанного скрипта ваши файлы будут выглядеть так:

.
`-- main
    |-- ccc
    |   |-- fo01
    |   |   |-- ccc_fo01_c_000
    |   |   `-- ccc_fo01_c_001
    |   `-- fo02
    |       |-- ccc_fo02_c_000
    |       `-- ccc_fo02_c_001
    |-- ddd
    |   |-- fo01
    |   |   |-- ddd_fo01_d_000
    |   |   `-- ddd_fo01_d_001
    |   `-- fo02
    |       |-- ddd_fo02_d_000
    |       `-- ddd_fo02_d_001
    `-- lll
        |-- fo01
        |   |-- lll_fo01_l_000
        |   `-- lll_fo01_l_001
        `-- fo02
            |-- lll_fo02_l_000
            `-- lll_fo02_l_001

Объяснение

  • для DIR в CCC DDD LLL; делать ...; Сделано : Сделайте это только для этих трех названий каталогов, сохраняя каждый из них как $ dir .
  • Найти «Главный / $ DIR» -Type F -Print0 | : Найти все файлы ( Тип f ) в Main / $ dir и распечатайте их, разделенные Нулевая строка ( -Print0 ) Для обеспечения того, чтобы он работает, даже если имена ваших файлов / каталогов содержат Newlines.
  • В то время как IFS = Read -R -D '' F; Сделайте : Это произойдет по итогам находит , сохраняя каждый как $ f . IFS = необходимо, чтобы избежать разрыва на пробере, -R - это так, что обратные косания не обрабатываются специально, а -D '' позволяет считывать чтение null-delimited вход.
  • dd = $ (dirname "$ f") : use Dd теперь является каталогом, в котором текущий файл находится. Например, MAIN / CCC / FO01 .
  • new = "$ {f / main \ /}" : Это использует манипуляцию строковых манипуляций оболочки для удаления строки MAIN / с пути файла.
  • new = "$ {new // \ // _}" : Как только теперь мы заменяем все / с подчеркиванием. Это приводит к строке, как CCC_FO01_C000 .
  • MV «$ F» «$ DD» / «$ new» : Наконец, мы переименовываем исходный файл на $ F , чтобы $ DD / $ new / $ new . Помните, что $ DD - это каталог, в котором был найден этот файл и $ new теперь имя, которое вы хотите переименовать его.

Я предлагаю вам добавить echo до MV , чтобы проверить, прежде чем на самом деле делать это.

0
28.09.2014, 09:58
2 ответа

Вот некоторые из выполненных мною тестов:

$ vi scriptName.sh
#!/bin/bash
cat

Затем выполнено,

$ ./scriptName < fileName

Он распечатает содержимое файла.

Это очень простой пример, и ввод используется только в одном месте. Если вы обрабатываете ввод более чем в одном месте, что обычно бывает при написании скрипта, вам придется использовать ответ, предоставленный Fazle.

0
28.01.2020, 04:58

Вам необходимо передать имя файла в качестве параметра в сценарий

#!/bin/bash
# myscript.sh
FILENAME=$1

echo "This is the filename:" $FILENAME

, то вот как вы позвоните скрипту

./myscript.sh thisfile.txt

быть выходом для сценария

This is the filename: thisfile.txt
0
28.01.2020, 04:58

Теги

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