Вы можете сделать что-то вроде этого:
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
, чтобы проверить, прежде чем на самом деле делать это.
Вот некоторые из выполненных мною тестов:
$ vi scriptName.sh
#!/bin/bash
cat
Затем выполнено,
$ ./scriptName < fileName
Он распечатает содержимое файла.
Это очень простой пример, и ввод используется только в одном месте. Если вы обрабатываете ввод более чем в одном месте, что обычно бывает при написании скрипта, вам придется использовать ответ, предоставленный Fazle.
Вам необходимо передать имя файла в качестве параметра в сценарий
#!/bin/bash
# myscript.sh
FILENAME=$1
echo "This is the filename:" $FILENAME
, то вот как вы позвоните скрипту
./myscript.sh thisfile.txt
быть выходом для сценария
This is the filename: thisfile.txt