在目录中搜索文件并将结果输出到文本文件

job*_*ade 5 command-line

是否有一些命令可以在目录中搜索文件并将结果输出到在找到的文件名之前带有前缀文本的文件?

例如,我有一个包含这些文件的目录:

sound1
sound2
sound3 
…
Run Code Online (Sandbox Code Playgroud)

然后给出一个命令来搜索目录并将结果写入一个前面带有前缀的文本文件,例如

media sound1
media sound2
media sound3
…
Run Code Online (Sandbox Code Playgroud)

奖金问题

有没有办法将“media1”、“media 2”等......而不是仅仅将“media”写入现有的文本文件而不删除之前该文本文件中的内容?

media1 sound1
media2 sound2
media3 sound3
…
Run Code Online (Sandbox Code Playgroud)

pa4*_*080 3

您可以find这样使用命令:

\n\n
find . ! -name \'sound.txt\' -type f -exec sh -c \'echo "media $(basename {}) "\' \\; > sound.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

解释:

\n\n
    \n
  • 第一个参数是目录的路径,在示例中这是当前目录.,但您可以将其更改为/any/desired/path/.

  • \n
  • ! -name \'sound.txt\'- 表示带有名称的项目sound.txt将被省略。

  • \n
  • -type f- 表示仅查找文件。

  • \n
  • -exec <command> \\;- 指示find命令执行<command>

  • \n
  • {}-exec是-之前整个命令的输出参数find . ! -name \'sound.txt\' -type f

  • \n
  • sh -c \'echo "media $(basename {}) "\'<command>将要执行的:

    \n\n
      \n
    • sh -c- 在 shell 中执行命令/bin/sh
    • \n
    • \'echo "media $(basename {}) "\'- 要执行的命令:
    • \n
    • echo "<something>"- 输出<something>STDOUT
    • \n
    • media- 只是一个字符串;
    • \n
    • $(<some command>)- 将 的结果视为<some command>字符串;
    • \n
    • basename {}- 仅打印文件名而不打印其路径,其中{}包含由生成的完整文件名的变量find . ! -name \'sound.txt\' -type f
    • \n
  • \n
  • 最后>重定向STDOUT;

  • \n
  • sound.txt是将 STDOUT 重定向到的文件的名称。
  • \n
\n\n
\n\n

从评论中更新。在评论中,有两个关于简化上述命令的建议:

\n\n\n\n
\n\n

使用示例。假设我们有一个具有以下结构的目录:

\n\n
$ tree .\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sound\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sound1\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sound2\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sound3\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sound4\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sound5\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sound99\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 soundd\n
Run Code Online (Sandbox Code Playgroud)\n\n

上述每个命令的输出将彼此相同:

\n\n
$ find . ! -name \'sound.txt\' -type f -printf \'media %f\\n\'\nmedia sound1\nmedia soundd\nmedia sound3\nmedia sound5\nmedia sound2\nmedia sound\nmedia sound99\nmedia sound4\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

奖金问题。根据奖励问题,该find命令不是最佳选择,但其输出可以通过管道 ( |) 传输到另一个命令或周期。这里有两个案例:

\n\n
    \n
  • 第一种情况是当我们只想计算结果时media#

    \n\n
    find . ! -name \'sound.txt\' -type f -printf \'media %f\\n\' | sort | \\\nwhile read -r i; do \\\n    count=$((count+1)); \\\n    echo $i | sed "s/media/media$count/"; \\\ndone\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    该命令的示例输出将是:

    \n\n
    $ find . ! -name \'sound.txt\' -type f -printf \'media %f\\n\' | sort | while read -r i; do count=$((count+1)); echo $i | sed "s/media/media$count/"; done\nmedia1 sound\nmedia2 sound1\nmedia3 sound2\nmedia4 sound3\nmedia5 sound4\nmedia6 sound5\nmedia7 sound99\nmedia8 soundd\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • sound#另一种情况是当我们想要将每个文件的编号分配给它的media前缀时。因为在示例中,有两个文件的名称中没有任何数字(sound, soundd),所以我们将为它们添加唯一的数字,因此前缀将为media/#

    \n\n
    find . ! -name \'sound.txt\' -type f -printf \'media %f\\n\' | sort | \\\nwhile read -r i; do \\\n    number=$(echo $i | grep -Eo \'[0-9]+\'); \\\n    if [ -z $number ]; then \\\n        count=$((count+1));\n        number="\\/$count"; \\\n    fi; \\\n    echo $i | sed "s/media/media$number\\t/"; \\\ndone\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    或者我们可以使用更简单的语法:

    \n\n
    find . ! -name \'sound.txt\' -type f -printf \'media %f\\n\' | sort  | \\\nwhile read -r i; do \\\n    number=$(echo $i | grep -Eo \'[0-9]+\'); \\\n    [ -z $number ] && count=$((count+1)) && number="\\/$count"; \\\n    echo $i | sed "s/media/media$number\\t/"; \ndone\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    该命令的示例输出将是:

    \n\n
    $ find . ! -name \'sound.txt\' -type f -printf \'media %f\\n\' | sort | while read -r i; do number=$(echo $i | grep -Eo \'[0-9]{1,99}\'); [ -z $number ] && count=$((count+1)) && number="\\/$count"; echo $i | sed "s/media/media$number\\t/"; done\nmedia/1  sound\nmedia1   sound1\nmedia2   sound2\nmedia3   sound3\nmedia4   sound4\nmedia5   sound5\nmedia99  sound99\nmedia/2  soundd\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 提示:

    \n\n
      \n
    • 您可以将多行命令直接复制并粘贴到终端。

    • \n
    • 不要忘记> sound.text在命令末尾将输出推送到文件中。

    • \n
    • 有线话题

    • \n
  • \n
\n

  • 您可以将 `-exec sh -c 'echo "media $(basename {}) "' {} \;` 替换为 `-printf 'media %f\n'` (2认同)

Beg*_*ner 0

试试这个脚本:

#!/bin/bash
dir=`find /home/username/ -name script_test`
ls $dir  > test.txt
sed -i -e 's/^/media /' test.txt
Run Code Online (Sandbox Code Playgroud)