On 2020-01-29 16:26, 李亮 wrote:
> Hi,
> 
> I executed two commands
> 
> 
> 
> 1
> find /mnt/src  -mindepth 3  -maxdepth 3  -type d -exec echo `echo {} | sed 
> 's/\/mnt\/src\//&\.\//'` \;
> The output is
> /mnt/src/1001/202001/20200101
> /mnt/src/1001/202001/20200102
> /mnt/src/1001/202001/20200128
> 
> 
> 2
> find /mnt/src  -mindepth 3  -maxdepth 3  -type d -exec echo `echo 
> /mnt/src/2001/202001/20200128 | sed 's/\/mnt\/src\//&\.\//'` \;
> The output is
> /mnt/src/./2001/202001/20200128
> /mnt/src/./2001/202001/20200128
> /mnt/src/./2001/202001/20200128
> 
> 
> 
> The second command is the format of the output I want, which I'm not sure is 
> a bug or my usage error.
> 
> Looking forward to reply.

The problem in example 1 is the use of the backticks `...`: the command between
is executed by the calling shell before 'find' even sees it.

  $ echo {} | sed 's/\/mnt\/src\//&\.\//'
  {}

This result is then passed as argument to find which then effectively runs like:

  $ find /mnt/src  -mindepth 3  -maxdepth 3  -type d -exec echo '{}' \;

I'm not 100% sure what you want to achieve with this additional './' (because 
it's redundant),
but you probably want something like this?

  $ mkdir -pv /mnt/src/1001/202001/20200101  /mnt/src/1001/202001/20200102 
/mnt/src/1001/202001/20200128
  mkdir: created directory '/mnt/src'
  mkdir: created directory '/mnt/src/1001'
  mkdir: created directory '/mnt/src/1001/202001'
  mkdir: created directory '/mnt/src/1001/202001/20200101'
  mkdir: created directory '/mnt/src/1001/202001/20200102'
  mkdir: created directory '/mnt/src/1001/202001/20200128'

  $ find /mnt/src  -mindepth 3  -maxdepth 3  -type d -printf '%H/.%p\n'
  /mnt/src/./mnt/src/1001/202001/20200102
  /mnt/src/./mnt/src/1001/202001/20200101
  /mnt/src/./mnt/src/1001/202001/20200128

Have a nice day,
Berny

Reply via email to