2017-04-30 3 views
3

ディレクトリ内のすべてのファイルのすべてのファイル名を.txtファイルに出力したいとします。ディレクトリ内のファイルのリストを端末からのテキストファイル(テキストファイル自体ではない)に出力する

file1.txt 
file2.txt 
file3.txt 

を、私はls > output.txtを使用してみました:

のは、私は3個のファイルとディレクトリを持っていたと仮定しよう。

file1.txt 
file2.txt 
file3.txt 
output.txt 

私は出力をリダイレクトしていたファイルの名前を印刷しないようにする方法があります:

事は、私がoutput.txtを開いたとき、私はこのリストを見つけることですか?それとも、ディレクトリ以外のディレクトリにあるファイルのすべてのファイル名を出力できるコマンドがありますか?

+1

出力を他のファイルと同じディレクトリに印刷する必要がありますか? – Jeremy

+2

@Jeremyそれを使って作業するほうが簡単です。しかし、はい、私は問題を完全に避ける別のディレクトリにファイルを作成することができます。私はそれについて考えなかった – jackscorrow

答えて

5
printf '%s\n' * > output.txt 

注 - そうであれば、まずそれを削除します。

  • printf '%s\n' *、確実に現在のディレクトリにあるすべてのファイルとサブディレクトリの名前を印刷する行ずつglobbing (filename expansion)を使用しています。その名前が出力に含まないあるので

  • glob動作は、output.txt前には、(あなたの問題を説明したコマンドがを実行する前に、まだ起き、)出力のリダイレクト> output.txtを介して作成されて起こります。

  • また、の使用は避けられます。このスクリプトの使用方法は、generally discouragedです。

1

一般的に、長年にわたり良好な立場にある必要がある制作品質のスクリプトを書くときには、lsの出力を解析するのは良いことではありません。理由を見つけるために、このページを参照してください:シェルがlsを実行する前に(output.txtとする)のリダイレクトを配置しているため、あなたの例ではDon't parse ls output

を、output.txtls > output.txtでの出力の一部です。

あなたのケースのための正しい動作を取得する最も簡単な方法は、次のようになります。

ls file*txt > output.txt # as long as you are looking for files named that way 

か、隠しファイル(または他のディレクトリにある通常のファイル内)に出力を格納し、その後に移動最後の場所:

ls > .output.txt && mv .output.txt output.txt 

より一般的な解決策はgrep -vを使用することになります。

ls | grep -vFx output.txt > output.txt 

それとも、あなたは、配列を使用することができます

files=("$(ls)") 
printf '%s\n' "${files[@]}" > output.txt 
+2

私はまだ行の1つが 'output.txt'(確かにエキゾチックなケース)である複数行のファイル名で動作すると思います。他の解決策としては、なぜ単一要素配列の代わりに文字列変数を使用するだけではないのですか? 'files ="($ ls) "; printf '%s' "$ files"> output.txt' – melpomene

0

を最も安全な方法は、ファイル名については何も想定しなくては、bash(メモリ内の)アレイや一時ファイルを使用することです。一時ファイルはメモリを必要としないので、さらに安全です。ような何か:これは何の既存のoutput.txtファイルがないことを前提としていることを

#!/bin/bash 
tmp=$(tempfile) 
ls > $tmp 
mv $tmp output.txt 
0

ls無視するオプションを持っており、我々はまた、findコマンドを使用することができます。 lsを使用して

  • はオプション

    ls -I "output.txt" > output.txt 
    ls --ignore "output.txt" > output.txt 
    

-I, --ignoreを無視すると同じです。このオプションは、マニュアルページのように、シェルPATTERNと一致する暗黙のエントリをリストしません。 find

  • 使用find

    find \! -name "output.txt" > output.txt 
    

-nameオプションは、その名のパターンに一致するファイル/ディレクトリを検索します。 ! -nameは、パターンに一致する名前を除外します。

find \! -name "output.txt" -printf '%P\n' > output.txt 

% Pパスを取り除き、名前だけを与えます。

+1

あなたのコマンドは_GNU_ユーティリティ(Linux)の使用を前提としています。 'find'コマンドが同等であるためには、(a)再帰を防ぐために' -maxdepth 1'が必要です。(b)ファイル名のリストをソートする必要があります。 – mklement0

+0

マシンにignoreオプションがありません。私はLinuxを使っていない – jackscorrow

関連する問題