3

Мне нужно написать в сценарий оболочки, который берет список каталогов из файла (каталоги будут в разных строках), а затем для каждого из этих путей к файлам он будет создавать скрытый фиктивный файл (например, .hiddenfile ) в каждом из этих каталогов ,

Видите, проблема, которую я пытаюсь решить, заключается в том, чтобы добавить пустые каталоги в систему контроля версий, и мы используем Git, который игнорирует пустые файлы. Тем не менее, я хотел бы знать, повторно использовать это решение (а именно, часть, где сценарий берет список каталогов и создает или редактирует файлы в каждом из этих каталогов) для потенциально других проблем.

Список каталогов будет абсолютным, как это: directories.txt:

/Users/johnnydoe/dir1/
/Users/johnnydoe/dir2/subdir2_1/
/Users/johnnydoe/dir3/subdir3_1/subdir3_2/
/Users/johnnydoe/dir4/
...

Содержимое .hiddenfile действительно будет произвольным. Ему просто нужно что-то, чтобы git фиксировал файлы следующим образом:

# don't leave me out of source control

Я просто не уверен, что Unix команда или использовать для облегчения этого.

Кстати, я использую версию Unix для Mac OS X, если это имеет значение.

Любые предложения будут с благодарностью заранее.

3 ответа3

3

Предполагая, что ваши имена каталогов более или менее вменяемые (пробелы в порядке), это должно работать:

while read -r n; do \
   echo "# don't leave me out of source control" > "$n"/.hiddenfile; \
done < dirlist.txt

Этот скриптлет будет перебирать список каталогов в dirlist.txt , сохраняя каждую строку как $n . Затем он использует echo для печати нужного текста в файл .hiddenfile в каждом каталоге.

0

xargs действительно хорошо работает для выполнения команды для каждого аргумента в списке.

например (cygwin, в OS X тоже есть xargs):

$ find ~/tmp/ -type d | xargs.exe -Iz  echo echo $RANDOM \> "z/.hidden"   |sh
$ find ~/tmp -type f -name \.hidden |head -n4
/home/jaroslav/tmp/.hidden
/home/jaroslav/tmp/Data/.hidden
/home/jaroslav/tmp/Data/Meshes/.hidden
/home/jaroslav/tmp/Data/Meshes/actors/.hidden

find ~/tmp -type d можно заменить на cat /path/dirlist.txt

Первая часть канала генерирует список каталогов. Вторая часть создает команду, которая будет отображать случайное число (bash) и записывать его в файл в найденном каталоге. Последняя часть канала выполняет эти команды.

0

"Один" лайнер, использующий tee:

echo "# don't leave me out of source control" |
 tee $( while read -r; do echo "$REPLY/.hiddenfile"; done < directories.txt) \
 > /dev/null

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .