すべての.mp4ムービーをテキストファイルに出力するのに問題があります。うまくいきますが、何か奇妙なことが起こっており、その理由がわかりません。
これはコマンドです。
find "/volume1 HD FILMS" -iname "*.mp4" -type f -exec ls {} \; > "/volume1/3. HD FILMS/HD_FILMS_`date +%d.%m.%Y`.txt"
- なぜパスを出力するのですか?ディレクトリのlsがファイルを印刷するとき(それが私が望むものです)
- 出力ファイルがアルファベット順ではないのはなぜですか? (ディレクトリのlsと再比較するとランダムに見えます。)
これらの問題をどのように解決できますか?
答え1
正確な質問に答えるには:
なぜパスを出力するのですか?ディレクトリのlsがファイルを印刷するとき(それが私が望むものです)
あなたが原因でパスを出力しますいいえディレクトリ内で。 ls somedir
とは異なりますcd somedir; ls
。
出力ファイルがアルファベット順ではないのはなぜですか? (ディレクトリのlsと再比較するとランダムに見えます。)
ls
ファイルをアルファベット順にソートして出力します。みんな。したがって、印刷する前に並べ替える機会があります。
find
withを使用して-exec
withコマンドを終了すると、明示的にコマンド(この場合はコマンド)を実行することを\;
意味します。find
ls
すべて見つかったファイルとしてfind
。したがって、ソートすることは不可能です。
これを使用すると、ls -l
各印刷行が実際に異なるコマンドから出力されるため、列が正しく揃っていないことがわかります。
代わりに、必要に応じてfind ... -ls
orまたはを使用することを検討してください。find ... -print
-exec ls
あなたはそれを使用することができます-exec ls {} +
、ほとんどのソートを処理する必要があります。 (具体的にはすべてのファイルを並べ替えることができますが、その数が大きすぎてシステム容量を超える場合は別々のコマンドを使用する必要があり、個々の配置ARG_MAX
は個別に並べ替えられます。)find
ls
メモ:個人的には、このようなファイル名のリストをテキストファイルに保存しません。できる改行文字を含みます。テキストファイルを個々のファイル名に解析する明確な方法はありません。期間。 (望むよりなぜいいえ分析ls
?)
代わりにfind
コマンドを実行してください。何かしたいときファイルと一緒に事前に実行し、前の出力で操作を実行しないでください。
人間が読めるすべてのファイルのリストを生成するには、mp4
パスコンポーネントを削除してこれらのファイル名に依存できないことを強調したいと思います。
find "/volume1 HD FILMS" -iname "*.mp4" -type f -print | sed 's:.*/::;s/\.[mM][pP]4$//' > "/volume1/3. HD FILMS/HD_FILMS_$(date +%d.%m.%Y).txt"