私のディレクトリには何百ものサブディレクトリがあり、すべて隠しファイルが含まれているため、そのサブディレクトリを表示するには、最初のピリオドを削除する必要があります。各ディレクトリに移動して表示するように変更するコマンドを見つけましたが、1つのディレクトリからコマンドが機能するようにする方法を知る必要があります。
rename 's/\.//;' .*
答え1
GNUの使用find
:
find /some/path -type f -name '.*' -execdir sh -c 'mv -i "$0" "./${0#./.}"' {} \;
パールを使うrename
:
find /some/path -type f -name '.*' -exec prename -i -n 's!.*/\K\.!!' {} +
-n
(結果が満足な場合は削除してください)。
答え2
すべての問題を解決する行がついに答えを見つけました。
find -mindepth 1 -depth -exec rename -n 's{/\.([^\/]*$)}{/$1}' {} +
答え3
単純なシェルスクリプトと一緒に使用すると、find
既存のファイルを上書きすることを確認して名前を変更できます。
find . -type f -name '.*' \
-execdir sh -c '[ ! -e "${1#.}" ] && mv "$1" "${1#.}"' sh {} ';'
この-execdir
オプションは、見つかった名前の親ディレクトリで引数を実行し、見つかった{}
名前(パスのない名前)のデフォルト名になります。このオプションは、標準の広範な実装の拡張ですfind
。
スクリプトsh -c
は、必要な名前がまだ使用されていないことを確認し、ファイルの名前を変更します。
引数置換は(ファイル名であるスクリプトの最初のコマンドライン引数)値を使用し、${1#.}
初期点を削除します。$1
sh -c
答え4
find . -type f -name .\* -exec rename -n 's/\.//;' {} +