Я хочу составить список моих подкаталогов. Когда я выполняю следующее для цикла loop, первое имя каталога встречается два раза
for d in */; do
echo $d >> directories.txt
done
Вывод выглядит так:
ONE/
TWO/
ONE/
В чем проблема?
Совершенствуя текущий код, эта команда может быть полезна:
for d in ./*;do [[ -d "$d" ]] && echo "$d" >> dir.txt; done
Чтобы удалить ./
из вывода:
for d in ./*;do [[ -d "$d" ]] && echo "${d##./}" >> dir.txt; done
Вы добавляете записи (>>)
, где вы должны перезаписывать их (>)
. Лучше использовать find
. Чтобы найти все подкаталоги рекурсивно, используйте
find . -type d > directories.txt
. Чтобы найти подкаталоги только в текущем каталоге, используйте
find . -type d -maxdepth 1 > directories.txt
-type d
, чтобы найти только список файлов каталога.
Что меня удивляет, так это отсутствие точки с запятой (;) в вашем решении, сохраняется ли ваша проблема, когда вы делаете:
for d in *; do echo $d >> directories.txt; done
? У меня работает нормально. Кроме того, вы уверены, что запускаете его в bash? Наконец, проблема может заключаться в «>>», вы можете добавлять имена каталогов несколько раз.
Не говоря уже о том, что если вы хотите перечислить только каталоги (не файлы), вы можете сделать следующее:
for d in `find . -type d -maxdepth 1`; do echo $d >> directories.txt; done
или даже проще:
find . -type d -maxdepth 1 > directories.txt