Как рекурсивно добавить (или изменить) файл в текущем каталоге, а также во всех его подкаталогах?
Например,
я хотел бы перевернуть это дерево каталогов:
.
├── 1
│ ├── A
│ └── B
├── 2
│ └── A
└── 3
├── A
└── B
└── I
9 directories, 0 files
в
.
├── 1
│ ├── A
│ │ └── file
│ ├── B
│ │ └── file
│ └── file
├── 2
│ ├── A
│ │ └── file
│ └── file
├── 3
│ ├── A
│ │ └── file
│ ├── B
│ │ ├── file
│ │ └── I
│ │ └── file
│ └── file
└── file
9 directories, 10 files
решение1
Как насчет:
find . -type d -exec cp file {} \;
От man find
:
-type c
File is of type c:
d directory
-exec command ;
Execute command; All following arguments to find are taken
to be arguments to the command until an argument consisting
of `;' is encountered. The string `{}' is replaced by the
current file
Таким образом, команда выше найдет все каталоги и выполнит команду cp file DIR_NAME/
для каждого из них.
решение2
Если вы просто хотите создать пустой файл, вы можете использовать touch
и shell glob. В zsh:
touch **/*(/e:REPLY+=/file:)
В Баше:
shopt -s globstar
for d in **/*/; do touch -- "$d/file"; done
Портативно вы можете использовать find
:
find . -type d -exec sh -c 'for d; do touch "$d/file"; done' _ {} +
Некоторые find
реализации, но не все, позволяют вам писатьfind . -type d -exec touch {}/file \;
Если вы хотите скопировать какой-то справочный контент, то вам придется вызвать find
цикл. В zsh:
for d in **/*(/); do cp -p reference_file "$d/file"; done
В Баше:
shopt -s globstar
for d in **/*/; do cp -p reference_file "$d/file"; done
Портативно:
find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +
решение3
Если вам нужны touch
файлы с именем $name в текущем каталоге и во всех подкаталогах, это сработает:
find . -type d -exec touch {}/"${name}" \;
Обратите внимание, что комментарий ChuckCottrill к ответу terdon НЕ работает, поскольку он будет работать только с touch
файлом $name в текущем каталоге и с самим каталогом.
Он не будет создавать файлы в подкаталогах, как того требует автор публикации, в то время как эта версия будет это делать.
решение4
Другой пример, который я только что тестировал, учитывая ваш пример, — это создание последовательных файлов в определенном подкаталоге, как у меня здесь.
├── FOLDER
│ ├── FOLDER1
│ └── FOLDER2
├── FOLDER
│ ├── FOLDER1
│ └── FOLDER2
└── FOLDER
├── FOLDER1
└── FOLDER2
Я использовал эту команду ниже, чтобы создать только в каталоге FOLDER2 файлы с последовательной числовой последовательностью, напримерfile{1..10}
for d in **/FOLDER2/; do touch $d/file{1..10}.doc; done