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')
(尽管您可以指示查找