for..in을 실행하고 터치하면 "파일 이름이 너무 깁니다"라는 메시지가 나타납니다.

for..in을 실행하고 터치하면 "파일 이름이 너무 깁니다"라는 메시지가 나타납니다.

디렉토리의 모든 파일을 터치하고 싶습니다.

files=$(ls -a "node_modules/suman-types/dts")

echo "files $files";

for file in "$files"; do
    echo "touching file $file";
    touch "node_modules/suman-types/dts/$file";
done

그러나 실행한 후에는 다음과 같은 결과를 얻습니다.

inject.d.ts
injection.d.ts
integrant-value-container.d.ts
it.d.ts
reporters.d.ts
runner.d.ts
suman-utils.d.ts
suman.d.ts
table-data.d.ts
test-suite-maker.d.ts
test-suite.d.ts: File name too long

"파일 이름이 너무 깁니다." 메시지는 무엇을 의미합니까?

업데이트 #1

내 스크립트를 다음과 같이 변경했습니다.

files=$(find "node_modules/suman-types/dts" -name "*.d.ts")

for file in "$files"; do
    echo "touching file $file";
    touch "$file";
done

touch "node_modules/suman-types"

그러나 나는 다음과 같은 사실을 이해했습니다.

$ ./types-touch.sh
    touching file node_modules/suman-types/dts/after-each.d.ts
    node_modules/suman-types/dts/after.d.ts
    node_modules/suman-types/dts/before-each.d.ts
    node_modules/suman-types/dts/before.d.ts
    node_modules/suman-types/dts/describe.d.ts
    node_modules/suman-types/dts/global.d.ts
    node_modules/suman-types/dts/index-init.d.ts
    node_modules/suman-types/dts/inject.d.ts
    node_modules/suman-types/dts/injection.d.ts
    node_modules/suman-types/dts/integrant-value-container.d.ts
    node_modules/suman-types/dts/it.d.ts
    node_modules/suman-types/dts/reporters.d.ts
    node_modules/suman-types/dts/runner.d.ts
    node_modules/suman-types/dts/suman-utils.d.ts
    node_modules/suman-types/dts/suman.d.ts
    node_modules/suman-types/dts/table-data.d.ts
    node_modules/suman-types/dts/test-suite-maker.d.ts
    node_modules/suman-types/dts/test-suite.d.ts
    touch: node_modules/suman-types/dts/after-each.d.ts
    node_modules/suman-types/dts/after.d.ts
    node_modules/suman-types/dts/before-each.d.ts
    node_modules/suman-types/dts/before.d.ts
    node_modules/suman-types/dts/describe.d.ts
    node_modules/suman-types/dts/global.d.ts
    node_modules/suman-types/dts/index-init.d.ts
    node_modules/suman-types/dts/inject.d.ts
    node_modules/suman-types/dts/injection.d.ts
    node_modules/suman-types/dts/integrant-value-container.d.ts
    node_modules/suman-types/dts/it.d.ts
    node_modules/suman-types/dts/reporters.d.ts
    node_modules/suman-types/dts/runner.d.ts
    node_modules/suman-types/dts/suman-utils.d.ts
    node_modules/suman-types/dts/suman.d.ts
    node_modules/suman-types/dts/table-data.d.ts
    node_modules/suman-types/dts/test-suite-maker.d.ts
    node_modules/suman-types/dts/test-suite.d.ts: No such file or directory

답변1

문제는 ls모든 출력을 라는 단일 (문자열) 변수로 캡처하는 데서 발생합니다 files. 변수는 다음과 같습니다:

filename1\nfilename2\nfilename3\n...

직접 확인해보세요:

echo "$files" | od -c

실제로 하고 있는 작업은 존재하지 않는 파일에 해당하는 매우 긴 문자열을 한 번 반복하는 것입니다. 나타나는 오류 메시지는 약간의 정보를 제공합니다. 이 긴 파일 이름 문자열이 존재하지 않는다는 것을 알려줍니다.

디렉토리의 모든 파일에 액세스하려면 쉘 와일드카드를 사용하고 실행하십시오 touch(와일드카드는 해당 디렉토리의 파일만 가져옵니다).

touch node_modules/suman-types/dts/*

또는 하나씩 터치해 보세요.

for file in node_modules/suman-types/dts/*; do touch "$file"; done

또는 디렉터리의 모든 파일을 재귀적으로 찾아 find실행하려면 다음을 수행하세요.touch

find node_modules/suman-types/dts -type f -exec touch -- {} \;

또는 이를 지원하는 쉘(Bash/ksh/zsh, 일부 변형이 있음)에서 재귀 glob 연산자를 사용하십시오 **.

shopt -s globstar # in Bash
for file in node_modules/suman-types/dts/**/*; do
    touch "$file"
done

답변2

이 시도파일 이름 확장자:

for file in node_modules/suman-types/dts/*; do
  echo "Touching file: ${file##*/}"
  touch "${file}"
done

관련 정보