使用 xargs 和变量

使用 xargs 和变量

嘿,我有一个问题。

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

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

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

例子:

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

/home/cas/plex-media/series/Pokémon/Season 1/Pokémon - S01E01 - Pokémon - I Choose You!.mp4
/home/cas/plex-media/series/Pokémon/Season 1/Pokémon - S01E02 - Pokémon Emergency.mp4
/home/cas/plex-media/series/Pokémon/Season 1/Pokémon - S01E03 - Ash Catches a Pokémon.mp4 

我希望它每次都由 xargs 执行:

file=/home/cas/plex-media/series/Pokémon/Season 1/Pokémon - S01E01 - Pokémon - I Choose You!.mp4 && echo /home/cas/plex-media/series/Pokémon/Season 1/Pokémon - S01E01 - Pokémon - I Choose You!.mp4
file=/home/cas/plex-media/series/Pokémon/Season 1/Pokémon - S01E02 - Pokémon Emergency.mp4 && echo /home/cas/plex-media/series/Pokémon/Season 1/Pokémon - S01E02 - Pokémon Emergency.mp4
file=/home/cas/plex-media/series/Pokémon/Season 1/Pokémon - S01E03 - Ash Catches a Pokémon.mp4 && echo /home/cas/plex-media/series/Pokémon/Season 1/Pokémon - S01E03 - Ash Catches a Pokémon.mp4

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

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

谢谢!

答案1

xargs与以下对象一起使用sh -c(或bash -c根据需要):

find ...  -print0 |  sort -z | xargs -0 -n1 -I{} sh -c 'file=$1; echo "$file";' xargs-sh {}

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

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

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

相关内容