web-dev-qa-db-ja.com

ファイル名を抽出するXargs

フォルダ内のすべての_.html_ファイルを検索し、_index.md_という名前の別のファイルに[file](./file.html)を追加します。私は次のコマンドを試しました:

_ls | awk "/\.html$/" | xargs -0 -I @@ -L 1 sh -c 'echo "[${@@%.*}](./@@)" >> index.md'
_

しかし、コマンド内で_@@_を置き換えることはできませんか?何が悪いのですか?

注:ファイル名にはスペースなどの有効な文字を含めることができます


明確化:

_index.md_の各行には[file](./file.html)が含まれます。ここで、fileはフォルダー内の実際のファイル名です

3
Nikhil

lsを解析しない
これにはxargsは必要ありません。find -execを使用できます。

これを試して、

find . -maxdepth 1 -type f -name "*.html" -exec \
    sh -c 'f=$(basename "$1"); echo "[${f%.*}]($1)" >> index.md' sh {} \;

wantxargsを使用する場合は、次の非常に類似したバージョンを使用します。

find . -maxdepth 1 -type f -name "*.html" -print0 | \
    xargs -0 -I{} sh -c 'f=$(basename "$1"); echo "[${f%.*}]($1)" >> index.md' sh {} \;

xargsまたは-execを実行しない別の方法:

find . -maxdepth 1 -type f -name "*.html" -printf '[%f](./%f)\n' \
    | sed 's/\.html\]/]/' \
    > index.md
9
pLumo

本当にxargsが必要ですか?

ls *.html | Perl -pe 's/.html\n//;$_="[$_](./$_.html)\n"'

(100000以上のファイルがある場合):

printf "%s\n" *.html | Perl -pe 's/.html\n//;$_="[$_](./$_.html)\n"'

または(遅いが、短い):

for f in *.html; do echo "[${f%.*}](./$f)"; done
1
Ole Tange