运行 for..in 并触摸时收到消息“文件名太长”

Ale*_*lls 1 bash shell-script touch

我想触摸目录中的每个文件:

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
Run Code Online (Sandbox Code Playgroud)

但运行后,我得到:

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
Run Code Online (Sandbox Code Playgroud)

“文件名太长”消息是关于什么的?

更新 #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"
Run Code Online (Sandbox Code Playgroud)

但后来我得到了这个:

$ ./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
Run Code Online (Sandbox Code Playgroud)

Jef*_*ler 10

您的问题源于将所有ls输出捕获到名为files. 变量看起来像:

filename1\nfilename2\nfilename3\n...
Run Code Online (Sandbox Code Playgroud)

自己看看:

echo "$files" | od -c
Run Code Online (Sandbox Code Playgroud)

你真正在做的是在一个非常长的字符串上循环一次,该字符串对应于一个不存在的文件。你得到的错误信息有点多——它告诉你这个长的文件名字符串不存在。

要访问目录中的每个文件,只需使用 shell globbing 并运行touch

touch node_modules/suman-types/dts/*
Run Code Online (Sandbox Code Playgroud)

或一一触摸:

for file in node_modules/suman-types/dts/*; do touch "$file"; done
Run Code Online (Sandbox Code Playgroud)

或找到它们并触摸它们:

find node_modules/suman-types/dts -type f -exec touch -- {} \;
Run Code Online (Sandbox Code Playgroud)