移动目录然后使用 bash shell 单行命令将 运行 命令移动到其中的文件的好方法是什么

What is good way to move a directory and then run a command to the file inside it using a bash shell one-liner

我想用 find 命令查找 txt 文件并移动找到的文件的目录,然后使用 bash shell 对文件应用命令-班轮

比如这条命令有效,但是acmd是在当前目录下执行的

$ find . -name "*.txt" | xargs acmd

我想 运行 acmd 在 txt 文件的目录中。

有谁有好主意吗?

来自查找手册页:--

 -execdir command ;

   -execdir command {} +
          Like  -exec, but the specified command is run from the subdirec‐
          tory containing the matched file,  which  is  not  normally  the
          directory  in  which  you started find.  This a much more secure
          method for invoking commands, as it avoids race conditions  dur‐
          ing  resolution  of the paths to the matched files.  As with the
          -exec action, the `+' form of -execdir will build a command line
          to  process more than one matched file, but any given invocation
          of command will only list files that exist in the same subdirec‐
          tory.   If  you use this option, you must ensure that your $PATH
          environment variable  does  not  reference  `.';  otherwise,  an
          attacker  can run any commands they like by leaving an appropri‐
          ately-named file in a directory in which you will run  -execdir.
          The  same  applies to having entries in $PATH which are empty or
          which are not absolute directory names.  If find  encounters  an
          error, this can sometimes cause an immediate exit, so some pend‐
          ing commands may not be run at all. The  result  of  the  action
          depends  on  whether  the  +  or  the  ;  variant is being used;
          -execdir command {} + always returns true, while  -execdir  com‐
          mand {} ; returns true only if command returns 0.

为了完整起见,另一种选择是:

$ find . -name \*.txt | xargs -i sh -c 'echo "for file $(basename {}), the directory is $(dirname '{}')"'
for file schedutil.txt, the directory is ./Documentation/scheduler
for file devices.txt, the directory is ./Documentation/admin-guide
for file kernel-parameters.txt, the directory is ./Documentation/admin-guide
for file gdbmacros.txt, the directory is ./Documentation/admin-guide/kdump
...

即让 xargs “遵从 shell”。在 -execdir 足够的用例中,去做吧。