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

関連情報