Оболочка Linux: LOOP для создания файла в каждой папке - PullRequest
0 голосов
/ 11 мая 2018

Эксперты

Я хочу создать файл в каждой папке. Вот моя команда

for i in `ls`;do cd $i;touch test.txt;done

-bash: cd: 10/: No such file or directory
-bash: cd: 2/: No such file or directory
-bash: cd: 3/: No such file or directory
-bash: cd: 4/: No such file or directory
-bash: cd: 5/: No such file or directory
-bash: cd: 6/: No such file or directory
-bash: cd: 7/: No such file or directory
-bash: cd: 8/: No such file or directory
-bash: cd: 9/: No such file or directory

Он генерирует только test.txt в папке 1/, остальные папки пусты. Я думаю, что причина в том, что у моей команды нет { }, чтобы уточнить масштаб LOOP для.

Не могли бы вы помочь мне обновить мою команду?

Ответы [ 4 ]

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

Немного изменив команду,

for i in `ls -1`;do touch "$i"/test.txt;done
0 голосов
/ 11 мая 2018

Вы cd в каталог, но вы не cd отступаете. Предполагая, что первым каталогом в списке является 1, ваш сценарий сначала изменится на 1, а затем пытается измениться на 1/10, который не существует.

Вы можете сделать cd - после касания файла.

Еще лучше, вы вообще избегаете cd и вместо этого делаете touch $i/test.txt.

Конечно, написанный сценарий не очень надежен: он ломается, если текущий каталог содержит простые файлы, и ломается, если он содержит записи, в именах которых есть пробелы - но это другая проблема.

0 голосов
/ 11 мая 2018
for dir in */; do
   touch "$dir/test.txt"
done
  1. Нет необходимости cd в каталоге создавать там файл.
  2. Не анализировать вывод ls. Вывод ls предназначен только для просмотра. Синтаксический анализ прервется, если в ваших файлах или каталогах есть имена, содержащие буквальные символы новой строки или пробелы.
  3. Шаблон */ будет соответствовать любому каталогу в текущем каталоге.
  4. Цитируйте ваши расширения переменных. Ваш код сломался бы, если IFS установлен на цифру.

Если вам действительно нужно сделать cd в каталоге, сделайте это в подоболочке. Измененный рабочий каталог влияет только на подоболочку, и нет необходимости cd возвращать.

for dir in */; do
   ( cd "$dir" && touch test.txt )
done
0 голосов
/ 11 мая 2018

Давайте рассмотрим, что у вас есть следующие 10 папок в вашем текущем рабочем каталоге:

tree .
.
├── 1
├── 10
├── 2
├── 3
├── 4
├── 5
├── 6
├── 7
├── 8
└── 9

вы можете выполнить следующую команду для создания ваших файлов:

for d in `find . -mindepth 1 -maxdepth 1 -type d`; do touch "$d"/test.txt; done

OUTPUT:

tree .
.
├── 1
│   └── test.txt
├── 10
│   └── test.txt
├── 2
│   └── test.txt
├── 3
│   └── test.txt
├── 4
│   └── test.txt
├── 5
│   └── test.txt
├── 6
│   └── test.txt
├── 7
│   └── test.txt
├── 8
│   └── test.txt
└── 9
    └── test.txt

10 directories, 10 files

Пояснения:

find . -mindepth 1 -maxdepth 1 -type d получит все папки, которые находятся ровно на 1 уровне в текущей рабочей папке, если вы пропустите-mindepth 1 тогда у вас будет файл, созданный в вашем текущем рабочем каталоге, так как будет выбран ., если вы опустите -maxdepth 1, тогда файл будет создан рекурсивно на любом уровне глубины, также -type d позволит фильтровать только накаталоги.

Вы можете использовать цикл для создания файлов, или даже команды xargs будет достаточно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...