現在のディレクトリですべてのファイルを見つけて内容を処理する前に、アルファベット順にソートして各ファイルの最初の3文字を抽出したいと思います。これにより、他のファイルにリダイレクトできる文が生成されます。私はこれを試しました:
find . -type f -exec basename {} \; | sort | xargs head -c 3
しかし、私は次のようになります。
ヘッド:読み取り用に 'filenamehere'を開くことができません。そのファイルやディレクトリはありません。
すべてのファイルに対して最初の3文字を抽出しようとしています。まず、ソートせずにこれを実行できました。
ベストアンサー1
編集する: 初めて:
find -type f -exec grep -I -q . {} \; -exec sh -c 'echo -e "$(basename "$0") {}"' {} \; | sort | cut -d ' ' -f2 | xargs sed -Ee 's/(^.{3})(.*)/\1/g'
grep -I -q . {} \;
画像などのバイナリファイルは検索されず、すべてのテキストファイルのみが検索されます。
第二:
私の基本的なアイデアは、キーが基本名と同じで、値が最初の3文字であるハッシュ関数を作成することです。
#!/bin/bash
touch file_s
echo 'declare -A map' > file_s
find . ! -name file_s ! -name sort_map -type f -exec grep -I -q . {} \; \
-exec sh -c 'i="$(basename "$0")";echo "map["$i"]=$(head -n 1 "$0"|cut -c
1-3)" >> file_s;' {} \; | sort | while read -r line
do
source file_s
echo -e ${map["$line"]}
done
このコードを書く必要があるスクリプトの名前は一時的sort_map
ですfile_s
。文書。したがって、findコマンドにこれら2つのファイルを含めないでください。grep -I -q . {} \;
grepファイルをバイナリファイルではなくテキストファイルとしてのみ作成します。
2番目の-exec
コマンドは次のとおりです。
i="$(basename "$0")";
デフォルト名を取得し、変数iに書き込みます。
echo "map["$i"]=$(head -n 1 "$0"|cut -c 1-3)" >> file_s;
ハッシュ関数とその値を一時ファイルに書き込みますfile_s
。
sort
ファイル名がソートされます。
while read -r line
do
source file_s
echo -e ${map["$line"]}
done
ファイルを1行ずつ読み込み、インポートしますfile_s
。これで最初の3文字が印刷されます。
head はファイル名ではなくファイルの内容を印刷するため、head は使用できません。
あなたはそれを使用することができます:
find . -type f -exec basename {} \; | sort | cut -c 1-3
b
または、オプションを代わりに使用できますが、c
すべての文字が1バイトであると仮定します。
find . -type f -exec basename {} \; | sort | cut -b 1-3
最初の3文字を取得します。
あなたはそれを使用することができます:
find . -type f -exec basename {} \; | sort | sed -Ee 's/(^.{3})(.*)/\1/g'
ファイルを並べ替え、最初の3文字を一致させてのみ印刷します。
メモ:これらのコマンドはすべて、スペースとタブを1文字として扱います。