ディレクトリ内のすべてのファイルの拡張子をどのように変更しますか? [コピー]

ディレクトリ内のすべてのファイルの拡張子をどのように変更しますか? [コピー]

現在、ディレクトリに拡張子がないファイルがいくつかあります(ファイル名にドットがありません)。

次のように名前を変更したいと思います。

filename -> filename.md

私はこれを試しましたが、mv * *.md役に立ちませんでした。

拡張子の引数を取得し、それに応じて名前を変更する関数と、ファイルの操作を実行する別の関数に興味があります。

ベストアンサー1

パターンはコマンドではなくシェルによって一致するため、試している操作が機能する可能性はありません。最初シェルはすべてのファイル(拡張子のないファイルだけでなく、名前にaを持たないファイル*については何も言わなかった)と名前があります。すべてのファイルに展開されます。その後、シェルは両方のリストの接続をコマンドに渡します。.*.md.mdmv

zshから

zshで次のコマンドを1回実行します(後で入力してください~/.zshrc)。

autoload -U zmv
# you don't need the following two now, but put them also in your .zshrc
alias zcp='zmv -C'
alias zln='zmv -L'

だからあなたは実行することができますzmvパターンに従ってファイル名を変更します。これら二つ模様zmvそして、適切な場合は、テキストを拡張する関数にそのまま渡すために代替テキストを引用する必要があります。

zmv '^*.*' '$f.md'

両方のパラメータの周囲に一重引用符があることに注意してください。パターンと代替式は文字通り関数に渡す必要がありますzmv

^*.*一致するファイルを除くすべてのファイルを示します。これは(既存のパターン構文のすべてのzsh拡張子)ショートカット*.*です。*~*.*このモードを外部で使用するには、まず実行する必要がありzmvますsetopt extended_glob(自分のモードにも適用されます.zshrc)。

バッシュから

Bashには便利なツールがないので、ループに頼る必要があります。まず、システムに存在する必要があるksh globbing拡張を有効にします~/.bashrc

shopt -s extglob

!(PATTERN)これで、演算子を使用して拡張子のないファイルを一致させることができます。

for x in !(*.*); do
  mv -- "$x" "$x.md"
done

$xファイル名にスペースまたはワイルドカードが含まれている場合は、二重引用符が必要です。--ファイル名-

どんな殻でも

演算子がない場合は、!(…)すべてのファイルを繰り返し、ループ内で各ファイル名をテストできます。

for x in *; do
  case "$x" in
    *.*) ;;         # skip this file
    *) mv -- "$x" "$x.md";;
  esac
done

おすすめ記事