使用 xargs 和变量

Cas*_*Cas 5 command-line bash scripts environment-variables

嘿,我有一个问题。

\n

这是我正在使用的命令(在 的位置echo $file是一个不同的命令。我简化了它):

\n

find /home/cas/plex-media/series/ -type f -name "*" ! -name "*.srt" -print0 | sort | xargs -0 -n1 -I{} file={} && echo $file

\n

它说这file={}不是一个命令,这是真的,因为它是一个变量。我需要每次将该变量设置为输出的一行,就像 xargs 对命令所做的那样。但我需要它来填充变量,然后为排序输出的每一行使用该变量运行该命令。

\n

例子:

\n

作为输入(又名排序输出):

\n
/home/cas/plex-media/series/Pok\xc3\xa9mon/Season 1/Pok\xc3\xa9mon - S01E01 - Pok\xc3\xa9mon - I Choose You!.mp4\n/home/cas/plex-media/series/Pok\xc3\xa9mon/Season 1/Pok\xc3\xa9mon - S01E02 - Pok\xc3\xa9mon Emergency.mp4\n/home/cas/plex-media/series/Pok\xc3\xa9mon/Season 1/Pok\xc3\xa9mon - S01E03 - Ash Catches a Pok\xc3\xa9mon.mp4 \n
Run Code Online (Sandbox Code Playgroud)\n

我希望 xargs 每次执行它:

\n
file=/home/cas/plex-media/series/Pok\xc3\xa9mon/Season 1/Pok\xc3\xa9mon - S01E01 - Pok\xc3\xa9mon - I Choose You!.mp4 && echo /home/cas/plex-media/series/Pok\xc3\xa9mon/Season 1/Pok\xc3\xa9mon - S01E01 - Pok\xc3\xa9mon - I Choose You!.mp4\nfile=/home/cas/plex-media/series/Pok\xc3\xa9mon/Season 1/Pok\xc3\xa9mon - S01E02 - Pok\xc3\xa9mon Emergency.mp4 && echo /home/cas/plex-media/series/Pok\xc3\xa9mon/Season 1/Pok\xc3\xa9mon - S01E02 - Pok\xc3\xa9mon Emergency.mp4\nfile=/home/cas/plex-media/series/Pok\xc3\xa9mon/Season 1/Pok\xc3\xa9mon - S01E03 - Ash Catches a Pok\xc3\xa9mon.mp4 && echo /home/cas/plex-media/series/Pok\xc3\xa9mon/Season 1/Pok\xc3\xa9mon - S01E03 - Ash Catches a Pok\xc3\xa9mon.mp4\n
Run Code Online (Sandbox Code Playgroud)\n

我不能只是这样做echo {},因为我的命令有多个地方{}需要填写,而且我有很多command {} $(other command {}). 所以我替换了所有需要将 sort 输出与变量放在一起的地方$file。因为这样 xargs 只需要更改变量一次并运行命令。然后更改变量并再次运行命令等等。

\n

我希望您理解我的问题以及我的目标是什么。你能帮助我吗?

\n

谢谢!

\n

pLu*_*umo 4

xargssh -c(或bash -c如果需要)一起使用:

find ...  -print0 |  sort -z | xargs -0 -n1 -I{} sh -c 'file=$1; echo "$file";' xargs-sh {}
Run Code Online (Sandbox Code Playgroud)

如果您不需要该sort步骤,最好避免xargs并使用find -exec

find /home/cas/plex-media/series/ -type f ! -name "*.srt" \
  -exec sh -c 'file=$1; echo "$file";' find-sh {} \;
Run Code Online (Sandbox Code Playgroud)

为什么我们需要这种奇怪的符号sh -c '...' sh {},请参阅是否可以find -exec sh -c安全使用?

  • 您将“{}”作为常规参数传递给“sh”脚本。这是唯一安全的方法,如果将“{}”直接放入脚本中,则会出现代码注入漏洞。 (2认同)