Bash 将文件路径转换为字符串

Bash 将文件路径转换为字符串,bash,shell,Bash,Shell,试图找到一种方法用另一个字符串替换目录路径中的字符串时出错 sed: Error tryning to read from {directory_path}: It's a directory shell脚本 #!/bin/sh R2K_SOURCE="source/" R2K_PROCESSED="processed/" R2K_TEMP_DIR="" echo " Procesando archivos desde $R2K_SOURCE " for file in $(find

试图找到一种方法用另一个字符串替换目录路径中的字符串时出错

sed: Error tryning to read from {directory_path}: It's a directory 
shell脚本

#!/bin/sh

R2K_SOURCE="source/"
R2K_PROCESSED="processed/"
R2K_TEMP_DIR=""

echo " Procesando archivos desde $R2K_SOURCE "

for file in $(find $R2K_SOURCE )
do
        if [ -d $file ]
        then
                R2K_TEMP_DIR=$( sed 's/"$R2K_SOURCE"/"$R2K_PROCESSED"/g' $file )
                echo "directorio $R2K_TEMP_DIR"
        else
#               some code executes
                :
        fi
done

# find $R2K_PROCCESED -type f -size -200c -delete
我知道错误就在这一行

R2K_TEMP_DIR=$( sed 's/"$R2K_SOURCE"/"$R2K_PROCESSED"/g' $file )

但我不知道如何告诉sh将$file变量视为字符串而不是目录对象。

如果要替换路径名的一部分,可以通过管道回显路径名并将其传递给sed。 您还必须通过将sed命令置于双引号而不是单引号中来启用全局绑定,并更改“s”命令的分隔符,如下所示:

R2K_TEMP_DIR=$(echo "$file" | sed "s:$R2K_SOURCE:$R2K_PROCESSED:g")
然后,您将能够在“s”命令中使用斜杠进行操作

更新:

更好的方法是删除无用的echo并使用“hereis string”:


R2K_TEMP_DIR=$(sed“s:$R2K_SOURCE:$R2K_PROCESSED:g“如果要替换路径名的一部分,可以通过管道回显路径名并将其传递给sed。
您还必须通过将sed命令置于双引号而不是单引号中来启用全局绑定,并更改“s”命令的分隔符,如下所示:

R2K_TEMP_DIR=$(echo "$file" | sed "s:$R2K_SOURCE:$R2K_PROCESSED:g")
然后,您将能够在“s”命令中使用斜杠进行操作

更新:

更好的方法是删除无用的echo并使用“hereis string”:

R2K_TEMP_DIR=$(sed“s:$R2K_SOURCE:$R2K_PROCESSED:g“首先,不要使用:

for item in $(find ...)
因为您可能会使命令行过载。此外,在
$(…)
中的进程完成之前,for循环无法启动。请改为:

find ... | while read item
您还需要注意时髦的文件名。
for
循环将在所有文件中使用空格。只要文件名中只有一个空格而不是两个空格,
find | while
就可以工作。更好的方法是:

find ... -print0 | while read -d '' -r item
这将在文件名之间放置空值,
read
将在这些空值上断开。这样,具有空格、制表符、新行或任何其他可能导致问题的文件都可以顺利读取

您的sed线路是:

R2K_TEMP_DIR=$( sed 's/"$R2K_SOURCE"/"$R2K_PROCESSED"/g' $file )
这试图做的是编辑您的
$file
,该文件是一个目录。您要做的是将目录名本身隐藏起来。因此,您必须将名称作为管道回显到
sed

R2K_TEMP_DIR=$(echo $file | sed 's/"$R2K_SOURCE"/"$R2K_PROCESSED"/g')
但是,最好使用环境变量参数来过滤环境变量

基本上,您有一个名为
source/
的目录,您要查找的所有文件都在该目录下。您只需更改:

 source/foo/bar

您可以执行类似于${file#source/}的操作。
#
表示这是一个左侧筛选器,它将在
#
之后删除与glob表达式匹配的最小数量。检查手册页中的
bash
并查看参数展开

你可以这样做:

#!/bin/sh

R2K_SOURCE="source/"
R2K_PROCESSED="processed/"
R2K_TEMP_DIR=""

echo " Procesando archivos desde $R2K_SOURCE "

find $R2K_SOURCE -print0 | while read -d '' -r file
do
    if [ -d $file ]
    then
        R2K_TEMP_DIR="processed/${file#source/}"
        echo "directorio $R2K_TEMP_DIR"
    else
#       some code executes
        :
    fi
done
R2K_TEMP_DIR=“processed/${file#source/}”
$file
的开头删除
源代码/
,您只需在其位置添加
processed/

更好的是,它的效率更高。在您的原始脚本中,
$(..)
创建另一个shell进程来运行
echo
,然后通过管道连接到另一个进程来运行
sed
(假设您使用的解决方案)。您不再运行任何子进程。对目录名的整个修改是内部的

顺便说一句,这也应该起作用:

R2K_TEMP_DIR="$R2K_PROCESSED/${file#$R2K_SOURCE}"
我只是没有测试它。

首先,不要使用:

for item in $(find ...)
因为您可能会使命令行过载。此外,在
$(…)
中的进程完成之前,for循环无法启动。请改为:

find ... | while read item
您还需要注意时髦的文件名。
for
循环将在所有文件中使用空格。只要文件名中只有一个空格而不是两个空格,
find | while
就可以工作。更好的方法是:

find ... -print0 | while read -d '' -r item
这将在文件名之间放置空值,
read
将在这些空值上断开。这样,具有空格、制表符、新行或任何其他可能导致问题的文件都可以顺利读取

您的sed线路是:

R2K_TEMP_DIR=$( sed 's/"$R2K_SOURCE"/"$R2K_PROCESSED"/g' $file )
这试图做的是编辑您的
$file
,该文件是一个目录。您要做的是将目录名本身隐藏起来。因此,您必须将名称作为管道回显到
sed

R2K_TEMP_DIR=$(echo $file | sed 's/"$R2K_SOURCE"/"$R2K_PROCESSED"/g')
但是,最好使用环境变量参数来过滤环境变量

基本上,您有一个名为
source/
的目录,您要查找的所有文件都在该目录下。您只需更改:

 source/foo/bar

您可以执行类似于${file#source/}的操作。
#
表示这是一个左侧筛选器,它将在
#
之后删除与glob表达式匹配的最小数量。检查手册页中的
bash
并查看参数展开

你可以这样做:

#!/bin/sh

R2K_SOURCE="source/"
R2K_PROCESSED="processed/"
R2K_TEMP_DIR=""

echo " Procesando archivos desde $R2K_SOURCE "

find $R2K_SOURCE -print0 | while read -d '' -r file
do
    if [ -d $file ]
    then
        R2K_TEMP_DIR="processed/${file#source/}"
        echo "directorio $R2K_TEMP_DIR"
    else
#       some code executes
        :
    fi
done
R2K_TEMP_DIR=“processed/${file#source/}”
$file
的开头删除
源代码/
,您只需在其位置添加
processed/

更好的是,它的效率更高。在您的原始脚本中,
$(..)
创建另一个shell进程来运行
echo
,然后通过管道连接到另一个进程来运行
sed
(假设您使用的解决方案)。您不再运行任何子进程。对目录名的整个修改是内部的

顺便说一句,这也应该起作用:

R2K_TEMP_DIR="$R2K_PROCESSED/${file#$R2K_SOURCE}"

我只是没有测试它。

可能:
R2K_TEMP_DIR=$(echo$file | sed的/“$R2K_源代码”/“$R2K_已处理的”/g”)
(虽然你可以指示
find
使用
-typef
/
-typed
@Wrikken独立查找目录和文件,但现在可以像答案一样写了,y会批准你的答案。谢谢,Lotletar的答案比我的快速评论更正确;)可能:
R2K_TEMP_DIR=$(echo$file | sed's/“$R2K_SOURCE”/“$R2K_已处理”/g')
(尽管您可以指示
查找