You're doing many things wrong:
- If you set AppleScript's text item delimiters to other then its default
{}
, always reset it to {}
when finished with the temporary delimiter.
input
is a list
and as such you should return
a list
and do it outside of the repeat
loop.
item 2
within the repeat
loop needs to be text item 2
, however, anItem
within the repeat
loop in this use case must also be text
, so it needs to be (anItem as text)
.
fileName
needs to be a list
because you are processing a list
and you need to return
a list
.
That said, here's an example Automator workflow with an AppleScript action coded in an example manner of how I'd write the code. Note though, that while it returns a list of the filenames after the $
delimiter, I'm not sure what good it's going to do you as it all depends on additional code not currently present in this example.
AppleScript code for the Run AppleScript action:
on run {input, parameters}
try
set AppleScript's text item delimiters to {"$"}
set theFileNameList to {}
repeat with thisItem in input
set the end of theFileNameList to text item 2 of (thisItem as text)
end repeat
set AppleScript's text item delimiters to {}
return theFileNameList
on error eStr number eNum
display dialog eStr & " number " & eNum buttons {"OK"} ¬
default button 1 with icon caution
set AppleScript's text item delimiters to {}
return
end try
end run
It is still not totally clear what it is you're trying to accomplish, however, here is an example workflow that you might find useful.
First Automator Workflow
- Broken into two working segments:
First Segment:
- Ask for Finder Items
- Rename Finder Items: Add Text
- Copy Finder Items
- Run Shell Script
- Settings: Shell: bin/bash and Pass input: as arguments
- Replace the default code with the code below.
- This is what's used to remove up to and including the
$
in the basename of the filename.
Code for Run Shell Script action:
cd "$(dirname "$1")"
for f in "$@"
do
mv "$(basename "$f")" "$(printf "$(basename "$f")" | sed -E 's/^.*\$//')"
done
echo "$(ls -1)"
- Note: The
echo "$(ls -1)"
command is not really necessary in this use case and was used in this example just to show the filenames had been changed and to show that in the Results pane.
Update: New code for Run Shell Script action:
Use this code instead of the original code, above. I've modified it to be a bit more efficient having to call basename
once, instead of twice. (I have not updated the code in the Run Shell Script action in the original image below.)
cd "$(dirname "$1")"
for f in "$@"; do
n="$(basename "$f")"
mv "$n" "$(printf "$n" | sed -E 's/^.*\$//')"
done
echo "$(ls -1)"
Note: See also the second Automator workflow, shown after the original image below, which negates the need for the Second Segment:, as its Run Shell Script action is coded to handle the renaming that takes place in the second segment, adding prefix-
and swapping -proc
for -suffix
.
Second Segment:
- Ask for Finder Items
- Options: [√] Ignore this action's input
- By checking this option you'll see, in the image below, there is a wanted disconnect between the previous action and this one.
- Rename Finder Items: Add Text
- Rename Finder Items: Add Text
See the image below for other applicable settings of Automator actions, as shown in the OP.
As you can see in the image below, all actions completed successfully and did as programed, with the Results pane of each action showing the results of it's action.
Second Automator Workflow
To be used instead of the First Automator Workflow.
- Ask for Finder Items
- Rename Finder Items: Add Text
- Copy Finder Items
- Run Shell Script
- Settings: Shell: bin/bash and Pass input: as arguments
- Replace the default code with the code below the image.
- The results of the first three actions in this second Automator workflow are the exact same as shown in the first workflow above, therefore I've left the Results pane hidden for these actions. However, the Results pane for the Run Shell Script action shows the wanted results.
Code for Run Shell Script action in the Second Automator Workflow:
p='prefix-'
s='-suffix'
t='-proc'
cd "$(dirname "$1")"
for f in "$@"; do
n="$(basename "$f")"
if [[ $n =~ ^.*\$.*${t}\.${n##*.} ]]; then
mv "$n" "${p}$(printf "${n%.*}" | sed -E -e "s/$t/$s/" -e 's/^.*\$//').${n##*.}"
fi
done
echo "$(ls -1)"
- Update Note: I've modified the code by placing the variable assignments outside of the
for
loop, as that is the only code you should need/want to modify as necessary (and they don't need to be within the for
loop). I have not updated the image of the Automator workflow to reflect this update.
You could, if needed/wanted, add a different second segment to this second workflow, but the code in this Run Shell Script action eliminates the need for the two Rename Finder Items: Add Text actions that were in the second segment of the first (original), workflow.
Note: I will update this with an explanation of what the code is doing in Run Shell Script action, as soon as I can.
Best Answer
If a folder/directory of the same base name of the file name does not exist at the same level as the file then it can be done, otherwise you cannot remove
.html
from the file name at the same level.To remove the extension and the . you need to use:
If the fully qualified pathname contains .html in other then the actual file name, then you'll have to use a Run Shell Script action instead of the Rename Finder Items action.
Run Shell Script action:
/bin/bash
Pass input: as arguments
NOTE: As coded, if folder/directory of the same base name of the file name does exist at the same level as the file then nothing will happen and the file name will be unchanged.
If you need to clean up things, that is to remove trailing . in the file names from the previous renaming, do the following in Terminal:
Same note from above applies here as well.