\
作業したいバックスラッシュを含むファイルが膨大ですが、次のような作業を試みるたびに:
$ ls -li
2036553851 -rw-rw-r-- 1 user user 6757 May 20 00:10 Simplex_config\\B1:B3\\_1.csv
2036553766 -rw-rw-r-- 1 user user 6756 May 20 00:07 Simplex_config\\B1:B3\\_2.csv
2036554099 -rw-rw-r-- 1 user user 6785 May 20 00:20 Simplex_config\\B1:B3\\_3.csv
2036553974 -rw-rw-r-- 1 user user 6785 May 20 00:15 Simplex_config\\B1:B3\\_4.csv
$ find . -type f -name 'Simplex*.csv' | xargs cat > looksee.txt
エラーが発生しますNo such file or directory
。ファイル名を変えてそうするか悩みもしてみましたが、もっと簡単な解決方法がないかと思いますinode
。
私は次のことを思い出しました。
#!/bin/sh
if [ -f looksee.txt ]; then
rm -rf looksee.txt
fi
ls -i Simplex_config*.csv | awk '{ print $1 }' > inode_list.txt
while IFS= read -r inode;
do
find . -inum $inode -exec cat {} \; >> looksee.txt
done < inode_list.txt
しかし、これは非常に面倒な作業なので、出力を解析し、それを1行プログラムの他のコマンドにパイプする方法を探したいと思います。ls -i Simplex_config*.csv
そのようなオプションを使用できますか?
答え1
1.
find . -type f -name 'Simplex*.csv' -print0 | xargs -0 cat > looksee.txt
~からmanxargs
- 無効
-0
入力は空白ではなくヌル文字で終わり、引用符とバックスラッシュは特別ではありません(各文字は文字通り使用されます)。他のパラメーターと同様に処理されるファイル終了文字列を無効にします。入力にスペース、引用符、またはバックスラッシュを含めることができる場合に便利です。 GNUfind -print0
オプションはこのモードに適した入力を生成します。
2.
find . -type f -name 'Simplex*.csv' -exec cat {} + > looksee.txt
~から人々が見つけた
- 注文を実行する。
コマンドを実行します。状態 0 が返されると true です。 findの次の引数は、次の引数が;
見つかるまでコマンドの引数として扱われます。文字列は、{}
いくつかのバージョンの find のように、別の引数だけでなく、コマンドの引数に現れる現在のファイル名に置き換えられます。\
シェル拡張から保護するために、両方の設定をエスケープまたは引用する必要があるかもしれません。一致するファイルごとに指定されたコマンドが一度実行されます。このコマンドは起動ディレクトリで実行されます。使用中に避けられない安全上の問題があります。-実現する対策を講じる必要があります。-execdir代わりにオプション。- コマンドの実行{}+
この亜種-実現するジョブは選択したファイルに対して指定されたコマンドを実行しますが、コマンドラインは選択した各ファイル名を最後に追加することによって構成されます。コマンドの総呼び出し数は、一致するファイルの数よりはるかに少なくなります。コマンドラインは、xargsがコマンドラインを作成するのとほぼ同じ方法で作成されます。{}
このインスタンスはコマンドに 1 つだけ許可されます。このコマンドは起動ディレクトリで実行されます。
三。
cat Simplex_config* > looksee.txt
レベルサブパスが1つしかない場合。
答え2
権限によるアクセス制御が中断されるため、inodeを介してファイルにアクセスできません。たとえば、ディレクトリを参照する権限がない場合、そのファイルに対する権限に関係なく、そのディレクトリ内のすべてのファイルにアクセスできません。 inodeを介してファイルにアクセスできる場合、ディレクトリ権限は無視されます。
したがって、ファイルのデバイス番号と inode 番号を取得できますが、そのファイルに対する操作を実行するには、ファイルパスを見つける必要があります。 (ㅏ道、いいえこれパスは、ファイルに複数のハードリンクがある場合は複数のパスを持つことができるためです。 )これは、inodeを使用すると、常により多くのタスクを実行する必要があることを意味します。 inodeを見る唯一の理由は、ハードリンクについて知りたいのですが、複数のハードリンクを持つ各ファイルに対して一度だけ実行することです。
and(システムで利用可能な場合)をfind
使用するか、コマンドを使用してこれを実行できます。詳細については、次を参照してください。-print0
xargs -0
-exec
スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?
find . -type f -name 'Simplex*.csv' -exec cat {} + > looksee.txt
find . -type f -name 'Simplex*.csv' -print0 | xargs -0 cat > looksee.txt
答え3
@Costasはすでに最高の答えを与えています。 2番目の質問をもう一度再生してみてください。
しかし、これは非常に面倒な作業なので、ls -i Simplex_config * .csvの出力を解析し、ある行から別のコマンドにパイプする方法を見つけたいと思います。これらのオプションは利用できますか?
xargsを使用できます。
ls -i | cut -d ' ' -f 1 | xargs -I '$input' find -inum '$input' -exec cat {} \;
この-I
オプションを使用すると、標準入力から読み取った内容に置き換える文字列を指定できます。