シェルスクリプトを介して「ファイル」と「スペースのあるディレクトリ名」を分割する

シェルスクリプトを介して「ファイル」と「スペースのあるディレクトリ名」を分割する

Files.txt次の内容を含むファイルがあります。

TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files/AppDelegate.m

以下のようにファイル名とディレクトリ名を抽出して別のプロセスに渡します。

files=$(cat Files.txt)

for item in $files ; do    
  dn=$(dirname $item)

  printf $item
  printf "\n"
  printf $dn
  printf "\n\n"

  # passing to another process
done

しかし、これは次のことを残します。

TestApp/Resources/Supporting
TestApp/Resources

Files/main.m
Files

TestApp/Resources/Supporting
TestApp/Resources

Files/AppDelegate.h
Files

TestApp/Resources/Supporting
TestApp/Resources

Files/AppDelegate.m
Files

私に必要なのはこれです:

TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files

\次のように空白プレフィックスを追加してみましたFiles.txt

TestApp/Resources/Supporting\ Files/main.m

そして%20次のように:

TestApp/Resources/Supporting%20Files/main.m

不運!

答え1

  1. forループ反復性格行ではない
  2. 常にあなたのコメントを引用してください"$variables"(いつ引用しないかを正確に知らない限り)。
while read -r item ; do    
  dn=$(dirname "$item")

  printf "%s\n" "$item"
  printf "%s\n" "$dn"

  # pass "$item" and "$dn" to another process
done < Files.txt

答え2

フィールド区切り記号を設定する必要があります。

OIFS=$IFS  
IFS=$'\n'

files=$(cat Files.txt)

for item in $files ; do    
  dn=$(dirname $item)
  printf $item
  printf "\n"
  printf $dn
  printf "\n\n"

  # passing to another process
done

IFS=$OIFS

出力:

[me@localhost test]$ ./test.sh 
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files

説明する: http://en.wikipedia.org/wiki/Internal_field_separator

この$IFS変数は入力がトークンに分割される方法を定義し、デフォルトではスペース、タブ、および改行が使用されます。改行にのみ分割したいので、$IFSこの変数を一時的に変更する必要があります。

関連情報