我想从一行中的路径字符串稍微改变目录名称。
例如,如果给定字符串是
'./dir1/dir2/dir3/xxx.txt'
我想要
'./dir1/fix_string_as_suffix'
我想将它与下面的find命令结合使用,虽然还没有修复。
find . -type d \( -name 'vendor' \) -prune -o -type f -name '*.txt' -print | cut -d'/' -f1,2
你可以使用sed
:
s='./dir1/dir2/dir3/xxx.txt'
sed -E 's~^(([^/]*/){2}).*~\1~' <<< "$s"
./dir1/
根据您是否要使用cut,sed或awk之类的标准实用程序,或者您希望将自己限制在shell本身内部的扩展和内置,可以有多种方法在shell中执行您想要的操作。一种方法是将路径拆分为组件,然后使用printf命令或内置组件重新加入它们。例如:
path='./dir1/dir2/dir3/xxx.txt'
IFS='/' read -ra dirs <<< "$path"
printf '%s' "${dirs[0]}/" "${dirs[1]}/" "..." $'\n'
如果要将其转换为单行,请使用分号和/或使用curly braces for command grouping连接命令。但是,可读性胜过简洁,特别是在shell编程中。
使用cut
命令:
#!/bin/bash
path="./dir1/dir2/dir3/xxx.txt"
suffix="something fixed string"
prefix=`echo $path | cut -d/ -f1,2`
echo "$prefix/$suffix"
使用;
连接上面的行以使其在一行上:
prefix=`echo $path | cut -d/ -f1,2` ; echo "$prefix/$suffix"
我认为这就是你要找的东西
find . -type d \( -name 'vendor' \) -prune -o -type f -name '*.txt' -exec sh -c 'echo "${1%/*}/fix_string_as_suffix"' fstrasuff {} \;
实际上,我最终如下。
find . -type d \( -name 'vendor' \) -prune -o -type f -name '*.txt' -print | cut -d'/' -f1,2 | uniq | awk '{print $1"/..."}'