現在、ディレクトリに拡張子がないファイルがいくつかあります(ファイル名にドットがありません)。
次のように名前を変更したいと思います。
filename -> filename.md
私はこれを試しましたが、mv * *.md
役に立ちませんでした。
拡張子の引数を取得し、それに応じて名前を変更する関数と、ファイルの操作を実行する別の関数に興味があります。
答え1
パターンはコマンドではなくシェルによって一致するため、試している操作が機能する可能性はありません。最初シェルはすべてのファイル(拡張子のないファイルだけでなく、名前にaを持たないファイル*
については何も言わなかった)と名前があります。すべてのファイルに展開されます。その後、シェルは両方のリストの接続をコマンドに渡します。.
*.md
.md
mv
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
答え2
あなたはrename
これを行うことができます(時々一緒に提供されるもの)perl
名前変更 prename
)。ディレクトリに別のファイルがある場合は、次のようにextglobを使用してそのファイルを除外する必要があります。
shopt -s extglob
rename s/$/.md/ -- !(*.*)
答え3
短い答えが見つかりました。ここ(これは名前の変更もサポートしていますが、これは私がこのページを見つけたときに探していたものです。)
for f in *.OLDNAME; do mv $f `basename $f .OLDNAME`.NEWNAME; done;
もちろん、これは拡張を追加または削除する場合にも当てはまります。
# Adding extension
for f in *; do mv $f ${f}.NEWNAME; done; # No need to use basename here -- just adding a new extension
# Removing extension
for f in *.OLDNAME; do mv $f `basename $f .OLDNAME`; done;
答え4
より簡単な方法があるかもしれませんが、この方法は非常に簡単であり、一般的な形式はさまざまな目的に使用されます。
for name in *; do
if [ -f "$name" ]; then
mv -- "$name" "$name.md"
fi
done
関数に変換することもできます。