라는 디렉토리가 있습니다 data
. 내부에는 50개 이상의 디렉토리가 포함된 data
디렉토리가 있고 그 안에 쉘 스크립트가 있습니다 . 설정은 다음과 같습니다:samples
testing.sh
data
data
|___ samples
|______ PREC001
|______ PREC003
|______ PREC023
|______ KRES118
|______ TWED054
.
.
.
|______ PREC098
|___ testing.sh
.txt
디렉터리 이름과 함께 모든 디렉터리에 대한 경로가 포함된 파일을 만들고 싶습니다 . 저는 리눅스에서 일하고 있어요.testing.sh
samples
생성된 파일은 .txt
다음과 같아야 합니다.
/data/testing.sh PREC001 samples
/data/testing.sh PREC003 samples
/data/testing.sh PREC023 samples
/data/testing.sh KRES118 samples
/data/testing.sh TWED054 samples
.
.
.
/data/testing.sh PREC098 samples
Linux에서 이를 수행하는 방법. 실제로 몇 가지 기본 명령을 시도했지만 원하는 것을 얻을 수 없었습니다. 감사해요.
답변1
이것은 단지 질문이어야 합니다:
(cd data/samples && printf '/data/testing.sh %s sample\n' *) > file.txt
또는 파일 형식으로 제한목차오직 zsh
:
printf '/data/testing.sh %s sample\n' data/samples/*(/:t) > file.txt
file.txt
또한 오류를 보고하고 일치하는 파일을 찾을 수 없는 경우 중단되지 않는다는 장점도 있습니다.
(/:t)
사용. . . 대신 (-/:t)
다음 유형의 파일도 포함합니다.심볼릭 링크궁극적으로 유형으로 확인되는 파일목차.
나중에 해석될 쉘 코드를 생성하려면 sh
파일 이름이 올바르게 인용되었는지 확인해야 합니다. 이를 %s
로 바꿀 수 있지만 스크립트가 에 특정한 인용 형식을 사용하는 것이 아니라 다음과 같이 %q
해석되도록 해야 합니다 .zsh
sh
%q
zsh
qq
또 다른 옵션은 항상 다음을 사용하는 인수 확장 플래그를 사용하는 것입니다.인용을 위한 작은따옴표는 가장 이식성이 뛰어나고 안전한 인용 연산자입니다.:
() {
printf '/data/testing.sh %s sample\n' ${(qq)@}
} data/samples/*(/:t) > file.txt
답변2
내가 올바르게 이해했다면 다음과 같이 할 수 있습니다.
cd /pathto/data/samples || exit
for d in */; do
echo "/data/testing.sh ${d: 1:-1} samples" >> /pathto/file.txt
done
$ cat file.txt
/data/testing.sh REC001 samples
/data/testing.sh REC003 samples
/data/testing.sh REC023 samples
...