単純なファイルループ - 「ファイル名が長すぎます」

単純なファイルループ - 「ファイル名が長すぎます」

私は最も基本的なタスク、つまり特定のフォルダ内のすべてのファイルに対して1つ以上のコマンドを実行しようとしています。

この場合、macOSpstopdfコマンドを使用してEPSファイルをPDFに変換します。

#!/bin/zsh

FILES=$(find "/Users/Ben/Pictures/Stock Illustrations" -type f)

for f in "$FILES"
do
   echo "$f"
   pstopdf "$f"
done

echo "$f"pstopdfすべてのファイルの正しいリストを生成しますが、それ自体が一見で始まる2番目のファイルのリストを取得しますが、残りのファイルは正しくリストされますFile name too long: /Users/Ben/Pictures/Stock Illustrations/Flock wallpaper.eps

ただし、このpstopdfコマンドはPDFファイルを生成しません。

**各コマンドがファイル名のリストを生成することを知るために、echoコマンドをコメントアウトしてみました。pstopdf

ターミナルで実行すると、pstopdf <file.eps>CLIからの出力は取得されません(ファイル名がリストされていません)、ファイルが処理されPDFファイルが生成されます。

私はコマンドxargsで利用可能であると言いますがfind、特に複数のコマンドや他のロジックのオプションを提供し、読みやすくするため、パラメータ付きループの構造化アプローチを好みます。

ここにも同様の質問があります。for..inを実行してタッチすると、「ファイル名が長すぎます」というメッセージが表示されます。

しかし、答えがどのように適用されるのか理解していません。 「または一つずつタッチしてください」(私が欲しいもの)となっていますが、そうすれば次のようになります。

FILES=/Users/Ben/Pictures/Stock\ Illustrations/*

「該当するファイルやディレクトリがありません」というメッセージが表示されます。

ベストアンサー1

FILES=$(find "/Users/Ben/Pictures/Stock Illustrations" -type f)
for f in "$FILES"

リンクされた投稿に示すように、$FILESここにはすべてのファイル名を含む文字列があります。ファイルが十分な場合、単一のファイル名が長すぎます。名前がほんの数しかない場合は、名前に改行文字を含むファイルにアクセスしようとします。

findここでは自分を呼ぶ方が良いですpstopf

$ find "/Users/Ben/Pictures/Stock Illustrations" -type f -print -exec pstopdf {} \;

find出力にシェルループを使用するには、次の手順を実行する必要があります(Bashではzshについて言及していません)。

set -f      # disable globbing
IFS=$'\n'   # set IFS to just the newline (Bash/ksh/zsh, not POSIX)
files=$(find "/Users/Ben/Pictures/Stock Illustrations" -type f)
for f in $files; do
    echo "$f"
    pstopdf "$f"
done

またはfind ... -print0 | while IFS= read -r -d '' f; do ...; doneBashで使用してください。

または、for f in "/Users/Ben/Pictures/Stock Illustrations"/**/*; do ...Bash(使用shopt -s globstar)、ksh、またはzsh(詳細はシェルによって多少異なります)。

どちらのシェルソリューションも改行文字を含むファイル名に問題があります。あなたにはそのような問題がないことを願っていますが、残念ながら改行文字は許可されています。

おすすめ記事