在 find 命令的 basename 上执行

Ber*_*ard 4 command-line find basename

假设我有一个目录结构如下

test
test/a
test/b
Run Code Online (Sandbox Code Playgroud)

现在我想执行一个命令,这样.我就可以在文件夹中对文件的基本名称ab.

所以基本上,我想要这样的东西,我天真地尝试过

find test -type f -exec touch `basename {}` \;
Run Code Online (Sandbox Code Playgroud)

只是,这不会导致空文件ab父目录。假设我的 touch 命令只能接受一个参数。

这将导致这样的目录结构

a
b
test
test/a
test/b
Run Code Online (Sandbox Code Playgroud)

我知道如何在 bash 脚本中执行此操作,但我对单命令解决方案感兴趣。

Ign*_*ams 5

执行 bash。

find ... -exec bash -c 'touch "${1##*/}"' btouch {} \;
Run Code Online (Sandbox Code Playgroud)

这里的${1##*/}意思是:从以 a 结尾的第二个参数中删除最长的匹配项/,从而保留最后一个/.

btouch可以是任何虚拟名称,以使其在活动进程列表中正确显示 ( ps)

  • http://wiki.bash-hackers.org/syntax/pe#from_the_beginning (2认同)
  • 因为它看起来很傻。另外,`$0` 显示在 `ps` 等中,以便您可以识别子进程。 (2认同)