2017-08-24 13 views
0

これをAutomatorに追加して、実行するディレクトリを選択させます。 1つのドライブはスペースを含むファイルをアップロードしません。私はすべてのスペースを削除することができましたが、最初と最後からすべてのスペースを削除しませんでした。Bashディレクトリ内のすべてのファイルの先頭と末尾のスペースを削除するスクリプト

マイコード:

for f in "$1"/*; do 
    dir=$(dirname "$f") 
    file=$(basename "$f") 
    mv "$f" "${dir}/${file//[^0-9A-Za-z.]}" 
done 
+0

これは不明ですが、あなたはファイル*の内容*ではなくファイル*の名前について話していると思います。 (再帰的な検索が必要な場合を除いて) 'for'または' while'ループ、 '-maxdepth 1'を使って' find'を使うことができます。また、bashを使用しているので、パラメータ拡張を使用して、後ろに空白があります。 –

答えて

2
#!/usr/bin/env bash 

shopt -s extglob      # Enable extended globbing syntax 
for path in "$1"/*; do 
    file=${path##*/}      # Trim directory name 
    file=${file##+([[:space:]])}   # Trim leading spaces 
    file=${file%%+([[:space:]])}   # Trim trailing spaces 
    if [[ $file != "${path##*/}" ]]; then # Skip files that aren't changed 
    mv -- "$path" "$1/${file}" 
    fi 
done 

注:

  • シェルは(例えばextglobbingと[[ ]]など)の拡張機能が利用可能であることを保証するために、bash、ないshで起動する必要があります。
  • dirnameに電話する必要はありません。私たちは常にディレクトリ名を知っているからです。それは$1です。
  • extglob構文は正規表現に匹敵するパワーを持つように正規グロブ表現を拡張します。 +([[:space:]])は "1つ以上のスペース"のextglobですが、${var%%pattern}${var##pattern}は、変数の値の前または後ろからそれぞれpatternにできるだけ多くの文字を削除します。
  • ファイル名を変更する必要がない場合はmvを実行する必要はありません。最初にチェックすることで少し最適化することができます。
+0

私はどのようにそれをAutomatorで呼び出すことで、私のユーザはそれを実行するディレクトリを選択できますか?私はFinder Itemを求めます。それをVarとしてシェルスクリプトを実行するように設定します。 –

+0

私の専門分野は、Automatorではなくbashです。しかし、Automatorから元のスクリプトを正常に開始できるのであれば、同じメカニズムが新しいスクリプトで動作することが期待されます。 –

+0

これは、 'extglob'と*対応する*拡張パターンが輝く場所です。ファイルがなければ$ {file#" $ {file %% [!space:]] *} "}"あなたが同じことを達成するためには、Automatorでうまくいきます。(そして、もっと複雑です...) –

関連する問題