嘿,我有一个问题。
这是我正在使用的命令(在的位置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
安全使用吗?